Since set seems to be broken, I find myself wanting to implement this metafunction. It need work only for vectors: // erase all occurrences of T in Seq template<typename Seq, typename T> struct eraseVal; After several hours and tens or hundreds of thousands of lines of error messages from three compilers, I am unable to get it working. My attempt to do it the "right" way looks like this, and I must warn you in advance that it's not pretty, unless you like an approach that calls find three times with the same arguments: template<typename Seq, typename T> struct eraseVal : mpl::eval_if< boost::is_same<typename mpl::find<Seq, T>::type, typename mpl::end<Seq>::type>, typename mpl::identity<Seq>::type, eraseVal<typename mpl::erase<Seq, typename mpl::find<Seq,T>::type, typename mpl::next<typename mpl::find<Seq,T>::type>::type >::type, T> > {}; My more procedural attempt looks better (to me), but it still doesn't compile: template<typename Seq, typename T> struct eraseVal { typedef typename mpl::find<Seq,T>::type iter; typedef typename mpl::eval_if< boost::is_same<iter, typename mpl::end<Seq>::type>, typename mpl::identity<Seq>::type, typename eraseVal<typename mpl::erase<Seq, iter, mpl::next<iter>::type >::type, T>::type > type; }; God I miss iteration. And I really wish emacs would match angle brackets in C++ mode, sigh. Can somebody please help me out? Thanks, Scott