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