
A type is an mpl sequence if mpl::sequence_tag<T>::type is something other than mpl::non_sequence_tag. There are a few ways of hooking mpl::sequence_tag, but the easiest is for T to have a nested typedef named "tag". I find this unfortunate. Consider proto expression types, which, in addition to being nodes in expression trees, are also both fusion sequences and mpl sequences. A proto expression type has three tag types associated with it: 1) The Proto tag (e.g., proto::tag::plus), a nested typedef named "proto_tag" 2) The Fusion tag, a nested typedef named "fusion_tag" 3) The MPL tag I can't in good conscience use a nested typedef named "tag" for the MPL tag because that would lead to confusion. It would be nice if MPL had instead chosen the name "mpl_tag" for its tag type. It's not too late to make the change ... MPL could first look for "mpl_tag" before falling back on "tag". For now, I have chosen to specialize mpl::sequence_tag for the proto::expr type. This is an incomplete solution because types that extend proto::expr are not themselves automatically MPL sequences. Another solution might be to allow SFINAE on sequence_tag, like ... template<typename T, typename EnableIf = void> struct sequence_tag; That way I could partially specialize for proto expression types, like: template<typename T, typename enable_if<proto::is_expr<T> >::type> struct sequence_tag { ... Thoughts? FWIW, I'd prefer MPL to rename the nested tag typedef to "mpl_tag". -- Eric Niebler BoostPro Computing http://www.boostpro.com