Enlarge the list of MPL templates.

I want to take a list of class templates, T 1 , T 2 , ... T N and have a list an MPL class list, where each template is created with the same parameter.

boost::mpl::list cannot be used with a list of template template parameters, only 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?

+6
source share
2 answers

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> > )); 
+3
source

I think you want this:

 #include <boost/mpl/list.hpp> #include <boost/mpl/transform.hpp> using namespace boost; using mpl::_1; template<typename T> struct Test {}; struct T1 {}; struct T2 {}; struct T3 {}; struct T4 {}; template<template <class> class T> struct ApplyParameterA { template<typename A> struct apply { typedef T<A> type; }; }; typedef mpl::transform< mpl::list<T1, T2, T3, T4>, mpl::apply1<ApplyParameterA<Test>, _1> > TypeList; 

it will do

 mpl::list<Test<T1>, Test<T2>, Test<T3>, Test<T4>> 

in typelist

0
source

Source: https://habr.com/ru/post/887337/


All Articles