Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2002-12-05 12:06:27

"David A. Greene" <greened_at_[hidden]> writes:

> [Posted to boost because MPL is not yet released. At what
> point should these questions go to boost-users?]
> Say I have a type my_type:
> template<typename T, typename U, typename V>
> struct my_type { ... }
> Now let's say I want to create a generator that
> binds T to some type but leaves U and V free to
> be filled in later. Basically, I want something
> like this:
> template<typename Bound>
> struct my_type_generator {
> template<typename U, typename V>
> struct apply {
> typedef my_type<Bound, U, V> type;
> };
> };

Looks good to me.

> Is there a convenient way to create this with MPL?

You want it to be more convenient than that?!

    template <class T, class U, class V>
    struct my_type_generator
        typedef my_type<T,U,V> type;

lambda<my_type_generator> does it, unless of course your compiler

I don't think it's much of a savings, though.

> I thought lambda might do the trick, but apparently not:
> typedef my_type<int, mpl::_1, mpl::_2> my_type_generator;
> (This will be passed to an MPL algorithm so I didn't
> bother with lambda<>).
> This causes a static assertion in mpl::arg<2> where it
> sees a void type for V (I think).
> Is the problem that my_type doesn't contain a ::type
> member?

Maybe. What compiler are you using?

> my_type is not a metafunction so maybe it just can't be used
> conveniently with mpl. It's easy enough to manually define
> my_type_generator, but I think this is a pretty common pattern and
> it might be useful as a library component.


                       David Abrahams
   dave_at_[hidden] *
Boost support, enhancements, training, and commercial distribution

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