2017-04-25 84 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 –