2017-04-25 47 views
1

我试图使用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

+0

因为这是堆栈溢出而不是什么应用程序 - 请在您的标题中更正式,并删除不合适的语言,如“_wtf_” –

+0

您能否粘贴错误消息并告诉我们您期望的结果是什么? – Roberto

+0

你会得到什么错误? 'boost :: tuple'是否有'operator []'? – NathanOliver

回答

4

该错误消息指出decltype正在评估对boost::hana::type_impl<Foo>::_&,这虽然有点神秘看,你可以通过&在它是一个参考到包含hana::type看到底。不幸的是,该引用不包含您期望在原始类型中找到的成员。

对于这个hana::type提供了一个一元operator+,简单地提领操作将原始类型,所以你可以做到以下几点:

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

hana::typeid_作品这个问题,以及它idempotently包裹的任何值在hana::type与常量和参考预选赛剥离:

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

值得一提的是以下所有花函数返回引用:

first,second,at,at_key和相关联的operator[]

+0

一元运算符+正在为我工​​作,但是当我尝试使用'hana :: typeid_'时,出现编译器错误,在命名空间hana中找不到'typeid_'。任何想法为什么会这样?我一般包括,我相信我正在使用最新的提升(假设自制软件有最新的提升,因为我确信cmake正在与brew副本链接)。这个功能是在某个点添加或删除的吗? – RyanP

+0

它被加进了Boost 1.62。 https://github.com/boostorg/hana/commit/edbbffeea4c1b118f4d634098dfa7ec2faa0f95d –