Boost logo

Boost Users :

From: Scott Meyers (usenet_at_[hidden])
Date: 2008-02-25 20:12:56


Steven Watanabe wrote:
> typedef make_features<mpl::vector<int, char, double> >::type f1;
> typedef make_features<mpl::vector<int, double> >::type f2;
> typedef make_features<mpl::vector<char> >::type f3;
> BOOST_MPL_ASSERT((boost::is_base_and_derived<f2, f1>));
> BOOST_MPL_ASSERT((boost::is_base_and_derived<f3, f1>));

Sorry for taking so long to reply, but TMP always makes my head explode, and it
takes a while to pick up the pieces and put them back together. In this case, I
could have saved myself the explosion, because this interface offers behavior
that is backwards from what I want. The conversion I want to allow is from
fewer features to more, so I don't want f2 and f3 to be bases of f1, I want f1
to be a base for both f2 and f3.

My current thinking is that this can't be done without knowing all possible
features, so I'm thinking about an approach where I first define that:

   typedef mpl::vector< ... > AllPossibleFeatures;

What I then want to define is

   template<typename MyFeatures> // sequence of features
   struct Features...

subject to the following:

   typedef difference<AllFeatures, MyFeatures> TypesToAdd; // Features in
                                                             // AllFeatures that
                                                             // are not in
                                                             // MyFeatures

   For each type T in TypesToAdd,
   Features<MyFeatures> virtually inherits from
   Features<insert<MyFeatures,T>::type>.

So given

   typedef mpl::vector<int, char, double> AllPossibleFeatures;

Features<mpl::vector<int>> (C++0x says I can omit the space between angle
brackets :-}) would virtually inherit from Features<mpl::vector<int, char>> and
Features<mpl::vector<int, double>.

In turn, Features<mpl::vector<int, char>> and Features<mpl::vector<int, double>>
would both virtually inherit from Features<mpl::vector<int, char, double>.

I can write the difference metafunction above and I can write a rotate
metafunction to help me iterate through all the types in the difference set.
What I don't know is a good way to give Features<T> the appropriate number of
virtual base classes. Can somebody help?

Thanks,

Scott


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net