hana :: second不能推断出类型

时间:2017-04-25 18:09:53

标签: c++ metaprogramming boost-hana

我正在尝试使用hana::type ...

从一对中访问hana::second
namespace hana = boost::hana;
using namespace hana::literals;

struct Key {};
struct Foo {};

int main() {

  auto test = hana::make_tuple(
      hana::make_pair(
        hana::type_c<Key>, 
        hana::type_c<Foo>));

  typename decltype(hana::type_c<Foo>)::type  finalTest; //Ok
  typename decltype(hana::second(test[0_c]))::type finalTest2; //Error
}

但是我收到以下编译错误:

stacktest.cpp: In function ‘int main()’:
stacktest.cpp:17:12: error: decltype evaluates to ‘boost::hana::type_impl<Foo>::_&’, which is not a class or enumeration type
   typename decltype(hana::second(test[0_c]))::type finalTest2;

为什么hana::second的结果未按预期返回包含的hana::type

1 个答案:

答案 0 :(得分:6)

错误消息指出decltype正在评估mvn deploy,虽然看起来有点神秘,但最后boost::hana::type_impl<Foo>::_&可以看到它是引用到包含的&。遗憾的是,引用不包含您希望在原始类型中找到的成员。

为此hana::type提供了一个一元hana::type,它只是取消引用原始类型,因此您可以执行以下操作:

operator+

typename decltype(+hana::second(test[0_c]))::type finalTest2; 适用于此,并且它在幂hana::typeid_中包含const和引用限定符的任意值:

hana::type

值得注意的是,以下所有Hana函数都返回引用:

typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2; firstsecondat以及关联的at_key