
David Abrahams wrote:
Nothing; this is clearly a bug in MPL
As a workaround, I thought I'd write an erase_first function as shown below, but this seems to have the same problem. Perhaps this is because I'm using erase in my implementation, and erase_key may, I suppose, be implemented on top of erase. More likely, I'm doing something wrong. More likely still, the way I'm doing it is gross. I'd appreciate feedback on the implementation of my erase_first function, where I've put comments showing the procedural equivalent of what I'm trying to do in each statement. Also, does anybody have a workaround for the bug in erase_key? Thanks, Scott #include <boost/mpl/set.hpp> #include <boost/mpl/equal.hpp> #include <boost/mpl/erase.hpp> #include <boost/mpl/if.hpp> #include <boost/mpl/end.hpp> #include <boost/mpl/find.hpp> namespace mpl = boost::mpl; using mpl::_1; using mpl::_2; struct A {}; struct B {}; typedef mpl::set<A, B> set1; typedef mpl::set<B, A> set2; // return Seq with the first occurrance of T removed template<typename Seq, typename T> struct erase_first { // i = Seq.find(T) typedef typename mpl::find<Seq, T>::type i; // found = (i == Seq.end()) ? false : true typedef typename mpl::if_< typename boost::is_same<i, typename mpl::end<Seq>::type >::type, mpl::false_, mpl::true_ >::type found; // type = found ? Seq : Seq.erase(i) typedef typename mpl::if_<found, Seq, typename mpl::erase<Seq, i>::type >::type type; }; BOOST_MPL_ASSERT(( mpl::equal< erase_first<set1, A>::type, erase_first<set2, A>::type
));