Boost logo

Boost :

Subject: [boost] [mpl] sequence_tag
From: Eric Niebler (eric_at_[hidden])
Date: 2009-01-13 13:30:34

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

Eric Niebler
BoostPro Computing

Boost list run by bdawes at, gregod at, cpdaniel at, john at