"Eric Niebler" schrieb im Newsbeitrag news:<4A8BB56F.7050706@boostpro.com>...
> Steven Watanabe wrote:
> > christophe henry wrote:
> >> I am trying to build a mpl::vector from an expression like
> >>
> >> (string(),ClassA(),ClassB())
> >>
> >> To get a mpl::vector
> >>
> >>
> >> Is there a way to do this or I should give up the idea?
> >
> > Does fold_tree help?
>
> It does.
>

*snip*
 
 
Ah It see. Thanks a lot, I think I got the idea.
I just have a concern with:
 
     template<class T> struct is_my : mpl::false_ {};
     template<> struct is_my<std::string> : mpl::true_ {};
     template<> struct is_my<ClassA> : mpl::true_ {};
     template<> struct is_my<ClassB> : mpl::true_ {};


As it forces extra declarations which not everybody is willing to make. But based on the same fold idea I can allow something like:
attributes_ << int() << std::map<int,int>() << bool()
 
Where attributes_ is made a proto terminal<my_tag> with proto::extends and the following grammar (which I shamelessly stole from the doc):
 
struct BuildAttributes
: proto::or_<
// Don't add the flag terminal to the list
proto::when<
     proto::terminal< my_tag >
   , proto::_state
  >
// Put all other terminals at the head of the
// list that we're building in the "state" parameter
, proto::when<
    proto::terminal<proto::_>
  , fusion::cons<proto::_value, proto::_state>(proto::_value, proto::_state)
  >
// For left-shift operations, first fold the right
// child to a list using the current state. Use
// the result as the state parameter when folding
// the left child to a list.
, proto::when<
     proto::shift_left<BuildAttributes, BuildAttributes>
   , proto::fold<
        proto::_
      , fusion::nil()
      , BuildAttributes>()
  >
>
{};
 
I then just have to invert the order again as it gets reversed (ok a few seconds more to compile...):
 
boost::mpl::copy<typename boost::result_of<BuildAttributes(Attr)>::type,boost::mpl::front_inserter<boost::mpl::vector<> > >::type
 
Correct?
 
Thanks a lot,
 
Christophe


What can you do with the new Windows Live? Find out