Search code examples
c++template-meta-programmingboost-mpl

Boost MPL list of templates


I want to take a list of class templates, T1, T2, ... TN and have a list an MPL list of classes, where each template is instantiated with the same parameter.

boost::mpl::list cannot be used with a list of template template parameters, just regular type parameters.

So the following does not work:

class A { ... };

template<template <class> class T>
struct ApplyParameterA
{
    typedef T<A> Type;
}

typedef boost::mpl::transform<
    boost::mpl::list<
        T1, T2, T3, T4, ...
    >,
    ApplyParameterA<boost::mpl::_1>::Type
> TypeList;

How can I make it work?


Solution

  • You want something like this:

    #include <boost/mpl/list.hpp>
    #include <boost/mpl/apply_wrap.hpp>
    #include <boost/mpl/transform.hpp>
    #include <boost/mpl/equal.hpp>
    #include <boost/mpl/assert.hpp>
    
    using namespace boost::mpl;
    
    template< typename U > class T1 {};
    template< typename U > class T2 {};
    template< typename U > class T3 {};
    
    class MyClass;
    
    typedef transform< 
          list< T1<_1>, T2<_1>, T3<_1> >
        , apply1<_1,MyClass>
        >::type r;
    
    BOOST_MPL_ASSERT(( equal< r, list<T1<MyClass>,T2<MyClass>,T3<MyClass> > ));