2017-01-04 9 views
2

Я использовал lite mpl, который я написал сам, но мне нужно, чтобы он был более надежным. В настоящее время я рассматриваю использование boost :: hana, и, похоже, у меня есть все, что мне нужно, за одним исключением: я не вижу способа изменить типы в hana :: tuple в контейнер этих типов.Преобразование типов в hana :: tuple to std :: vector <type> в пределах hana :: tuple

Например, это то, что я использую для преобразования зОго :: кортежа типов в станде :: кортеж станда :: векторы этих типов:

#include <vector> 
#include <tuple> 

template<typename... Ts> 
struct Typelist{ 
}; 

// Declare List 
template<class> class List; 

// Specialize it, in order to drill down into the template parameters. 
template<template<typename...Args> class t, typename ...Ts> 
struct List<t<Ts...>> { 
    using type = std::tuple<std::vector<Ts>...>; 
}; 

// Sample Typelist 

struct A{}; 
struct B{}; 
struct C{}; 

using myStructs = Typelist<A,B,C>; 

// And, the tuple of vectors: 

List<myStructs>::type my_tuple; 

// Proof 

int main() 
{ 
    std::vector<A> &a_ref=std::get<0>(my_tuple); 
    std::vector<B> &b_ref=std::get<1>(my_tuple); 
    std::vector<C> &c_ref=std::get<2>(my_tuple); 
    return 0; 
} 

Есть ли повышающий :: хана вариант этого, что я с видом? Или мне нужно довести это до конца и изменить его для работы с hana :: tuple вместо std :: tuple?

ответ

2

Вы можете использовать hana::transform для этого:

auto types = hana::tuple_t<A,B,C>; 
auto vecs = hana::transform(types, [](auto t) { 
    return hana::type_c<std::vector<typename decltype(t)::type>>; 
});  

static_assert(vecs == 
       hana::tuple_t<std::vector<A>, std::vector<B>, std::vector<C>>, 
       "wat"); 

Это карты по сортам в types кортеже и бросает их в std::vector.