如何从 boost::hana::tuple_t 检索类型?

How to retrieve types from boost::hana::tuple_t?

我已经使用 hana:tuple_t 来存储和检索类型列表:

auto Types = hana::tuple_t<int, double>;
auto first_t = Types[hana::int_c<0>];
static_assert(std::is_same_v<decltype(first_t)::type, int>); // line 3

上面的代码工作正常,但是当我试图用它的实际表达式替换变量 first_t 时:

static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>); //line 4

我得到一个编译错误:

template argument 1 is invalid
     static_assert(std::is_same_v<decltype(Types[hana::int_c<0>])::type, int>);
 error: decltype evaluates to ‘const boost::hana::type_impl<int>::_&’, which is not a class or enumeration type

上面代码的第3行和第4行是等价的,为什么第4行编译报错:

decltype(Types[hana::int_c<0>]) 是对 boost::hana::type_impl<int>::_const 引用,您无法查询 reference 以从参考d类型.

first_t 只用 auto 声明,这会删除引用和常量。如果你想保留它(在不同的情况下),你可以声明它 auto & first_t = ....

static_assert(std::is_same_v<decltype(first_t), boost::hana::type_impl<int>::_>);

您可以使用 std::decay_t 删除引用。

static_assert(std::is_same_v<
    std::decay_t<decltype(Types[hana::int_c<0>])>::type, int>);