将 hana::tuple 中的类型转换为 hana::tuple 中的 std::vector<type>
Convert types in hana::tuple to std::vector<type> within a hana::tuple
我一直在使用我自己编写的精简版 mpl,但我需要它更健壮。目前,我正在考虑使用 boost::hana,它似乎拥有我需要的一切,但有一个例外:我看不出有任何方法可以将 hana::tuple 中的类型更改为这些类型的容器.
例如,这就是我用来将类型 std::tuple 转换为 std::tuple 类型 std::vectors 的方法:
#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;
}
是否有我忽略的 boost::hana 变体?或者我是否需要将它带过来并进行更改以使用 hana::tuple 而不是 std::tuple?
您可以为此使用 hana::transform
:
#include <vector>
#include <boost/hana/transform.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/equal.hpp>
namespace hana = boost::hana;
struct A {};
struct B {};
struct C {};
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>>;
});
auto main() -> int {
static_assert(
vecs == hana::tuple_t<std::vector<A>, std::vector<B>, std::vector<C>>,
"wat"
);
return 0;
};
这会映射 types
元组中的类型并将它们放入 std::vector
。
我一直在使用我自己编写的精简版 mpl,但我需要它更健壮。目前,我正在考虑使用 boost::hana,它似乎拥有我需要的一切,但有一个例外:我看不出有任何方法可以将 hana::tuple 中的类型更改为这些类型的容器.
例如,这就是我用来将类型 std::tuple 转换为 std::tuple 类型 std::vectors 的方法:
#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;
}
是否有我忽略的 boost::hana 变体?或者我是否需要将它带过来并进行更改以使用 hana::tuple 而不是 std::tuple?
您可以为此使用 hana::transform
:
#include <vector>
#include <boost/hana/transform.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/equal.hpp>
namespace hana = boost::hana;
struct A {};
struct B {};
struct C {};
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>>;
});
auto main() -> int {
static_assert(
vecs == hana::tuple_t<std::vector<A>, std::vector<B>, std::vector<C>>,
"wat"
);
return 0;
};
这会映射 types
元组中的类型并将它们放入 std::vector
。