Я не думаю, что это возможно с mpl::transform
, так как в результирующей последовательности потребуется сгенерировать несколько элементов из одного в исходной последовательности.Однако это можно сделать с помощью mpl::fold
вместе со специализацией с mpl::is_sequence
:
// Default case
template < typename Seq, typename TWrapper, typename Enable = void >
struct Flatten_imp
: mpl::push_back< Seq, typename TWrapper::type >
{
};
// Sequence case
template < typename Seq, typename TWrapper >
struct Flatten_imp<
Seq,
TWrapper, typename
boost::enable_if<
mpl::is_sequence< typename
TWrapper::type
>
>::type
>
{
typedef mpl::joint_view<
Seq, typename
TWrapper::type
> type;
};
template < typename Seq >
struct Flatten
: mpl::fold< Seq, mpl::vector<>, Flatten_imp< mpl::_, mpl::_ > >
{}
int main()
{
typedef mpl::vector< Struct1, Struct2, Struct3 > MPLVector;
typedef Flatten< MPLVector >::type TypeList;
static_assert(
mpl::equal<
TypeList,
mpl::vector< int, float, char, double >
>::value, "Is not same");
}
Если вы хотите, чтобы выравнивание было рекурсивным, выможно вызвать Flatten
в Flatten_impl
, чтобы сгладить последовательность перед ее добавлением;однако, будьте осторожны, эта рекурсия будет работать, только если ваши последовательности содержат обертки, а не прямые типы, например
struct Struct3
{
typedef mpl::vector< mpl::identity< char >, mpl::identity< double > > type;
}