将hana :: tuple中的类型转换为hana :: tuple

时间:2017-01-04 15:40:17

标签: c++ boost type-conversion tuples boost-hana

我一直在使用我自己编写的精简版,但我需要它更强大。目前,我正在寻找使用boost :: hana,它似乎拥有我需要的一切,但有一个例外:我没有看到任何方法将hana :: tuple中的类型更改为这些类型的容器。

例如,这就是我用来将std :: tuple类型转换为这些类型的std :: vector的std :: 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变种吗?或者我是否需要将其更改并将其更改为使用hana :: tuple而不是std :: tuple?

1 个答案:

答案 0 :(得分:3)

您可以使用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