【问题标题】:hana::second can't deduce typehana::second 无法推断类型
【发布时间】:2017-04-25 18:09:52
【问题描述】:

我正在尝试使用 hana::second 从一对中访问 hana::type...

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

【问题讨论】:

  • 我投了反对票,因为这是 Stack Overflow 而不是 What's App - 请在标题中更加正式,并删除不恰当的语言,例如“wtf
  • 能否请您粘贴错误消息并告诉我们您期望的结果是什么?
  • 你得到什么错误? boost::tupleoperator[] 吗?
  • 我讨厌我的编译器提供像 //Error 这样的错误消息,它内嵌到代码中。很难弄清楚。
  • 问题在于hana::second 返回了对包含值的引用。您可以将其包装在 hana::typeid_(...) 中以获取 hana::type 并去除 ref 限定符。如果它的格式更好一点,这可能是一个好问题。

标签: c++ metaprogramming boost-hana


【解决方案1】:

错误消息指出 decltype 正在评估为 boost::hana::type_impl&lt;Foo&gt;::_&amp;,虽然看起来有点神秘,但您可以通过末尾的 &amp; 看到它是对包含的 reference hana::type。不幸的是,该引用不会包含您希望在原始类型中找到的成员。

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

typename decltype(+hana::second(test[0_c]))::type finalTest2;

hana::typeid_ 适用于此,并且它可以幂等地将任何值包装在 hana::type 中,并去除 const 和引用限定符:

typename decltype(hana::typeid_(hana::second(test[0_c])))::type finalTest2;

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

firstsecondatat_key,以及关联的operator[]

【讨论】:

  • 一元运算符 + 正在为我工​​作,但是当我尝试使用 hana::typeid_ 时,我收到一个编译器错误,即在命名空间 hana 中找不到 typeid_。知道为什么会这样吗?我通常包含 并且我相信我正在使用最新的提升(假设自制软件具有最新的提升,因为我相当确定 cmake 正在链接到 brew 副本)。这个功能是在某个时候添加或删除的吗?
  • 它是在 Boost 1.62 中添加的。 github.com/boostorg/hana/commit/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多