Jaap Suter wrote:
> Hi,

Hi Jaap,

>
> In some of my MPL-using code I needed set-based functionality. So I wrote
a
> function that does an insertion into an ordered list of constants.
However,
> it seems that if I compare a list created from a bunch of constants to an
> explicit list, they don't end up the same. I've attached the example code
> below.

[snip]

> template < class N, class L >
> struct add_to_sorted_list
> {
>     typedef typename mpl::if_<
>         typename mpl::contains< L, N >::type,
>         L,
>         typename mpl::insert< L,
>             typename mpl::lower_bound< L,
>                 N,
>                 mpl::less< mpl::_, mpl::_ >
>             >::type,
>             N
>         >::type
>     >::type type;
> };
>
> typedef mpl::list_c< int, 0, 1, 2, 3 > list0;
> typedef mpl::list_c< int, 0, 1,     3 > list1;
> typedef add_to_sorted_list<
>                 mpl::integral_c< int, 2 >,
>                 list1,
>             >::type result;
>
> BOOST_STATIC_ASSERT( is_same< list0, result >::value ); // THIS FAILS;

The lists _are_ the same, content-wise, and that's what you actually should
be checking for:

BOOST_STATIC_ASSERT(( mpl::equal< list0, result >::type::value ));

Test for two sequences having the same C++ type isn't guaranteed to work, as
any manipulation of sequence content changes the sequence's type, and often
it's not worthy to maintain invariants along the lines of this one:

    typedef list_c<int,0> l0;
    typedef list_c<int,1,0> l1;
    typedef push_front<l0, int_<1> >::type res;
    BOOST_STATIC_ASSERT((is_same<res,l1>::value)); // most probably fails

If an analogy can help here, in some sense comparing for type equality
instead of content equality is somewhat similar to writing

    std::vector<int> v1;
    std::vector<int> v2;

    assert(&v1 == &v2);

instead of

    assert(v1 == v2);


HTH,
Aleksey




_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to