2017-02-06 3 views
1

Предположим, у меня есть boost::mpl::vector «myvec», определяется, например, как это:Как преобразовать boost :: mpl :: vector в другой boost :: mpl :: vector?

using myvec = boost::mpl::vector<int, double, double>; 

Теперь я хочу, чтобы определить другой тип, myvecex, который преобразует каждый myvec элемент в std::tuple с добавлением строки. Я хочу, чтобы получить тип, определенный как это:

using myvecex = boost::mpl::vector<std::tuple<int, std::string>, 
            std::tuple<double, std::string>, 
            std::tuple<double, std::string> >; 

Но я не хочу повторять себе и имя всех членов вектора. Вместо этого я хочу определить тип шаблона , где я каким-то образом поставил бы логику преобразования каждого типа элемента в кортеж.

using myvecex2 = some_smart_template<myvec>; 
static_assert(std::is_same<myvecex, myvecex2>::value); 

Возможно ли это на C++?

ответ

1

Boost.MPL не просто дает вам контейнеры, но и дает вам алгоритмы над этими контейнерами. В этом случае, что вы хотите transform:

template< 
     typename Sequence 
    , typename Op 
    , typename In = unspecified 
    > 
struct transform 
{ 
    typedef unspecified type; 
}; 

Семантика вы даете ему последовательность и то, что MPL относится к как Lambda Expression и вы получите еще одну последовательность. В частности:

using B = mpl::transform<A, 
    std::tuple<mpl::_1, std::string> 
    >::type; 

Или, по крайней мере, это будет работать, если apply поддерживаются шаблоны VARIADIC класса как std::tuple. Так что вам нужно просто написать операцию, это либо класс metafunction:

struct tuple_of_strings { 
    template <class T> 
    struct apply { 
     using type = std::tuple<T, std::string>; 
    }; 
}; 

using B = mpl::transform<A, tuple_of_strings>::type; 

или metafunction:

template <class T> 
struct tuple_of_strings { 
    using type = std::tuple<T, std::string>; 
}; 

using B = mpl::transform<A, tuple_of_strings<_1>>::type; 
Смежные вопросы