2017-05-26 59 views
0

的扣除之前的代碼片段說不是幾個段落更多:使用boost ::花:: eval_if_t汽車

#include <boost/hana/fwd/eval_if.hpp> 
#include <boost/hana/core/is_a.hpp>                                  
#include <iostream> 
#include <functional> 

using namespace boost::hana; 

template<class arg_t> 
decltype(auto) f2(arg_t const& a) 
{ 
    constexpr bool b = is_a<std::reference_wrapper<std::string>, 
          arg_t>; 

    auto wrapper_case = [&a](auto _) -> std::string& 
         { return _(a).get(); }; 

    auto default_case = [&a]() -> arg_t const& 
         { return a; }; 

    return eval_if(b, wrapper_case, default_case); 
} 

int main() 
{ 
    int a = 3; 
    std::string str = "hi!"; 
    auto str_ref = std::ref(str); 

    std::cout << f2(a) << ", " << f2(str) << ", " << f2(str_ref) 
       << std::endl; 
} 

編譯器錯誤是:

$> g++ -std=c++14 main.cpp 
main.cpp: In instantiation of ‘decltype(auto) f2(const arg_t&) [with arg_t = int]’: 
main.cpp:42:22: required from here 
main.cpp:31:19: error: use of ‘constexpr decltype(auto) boost::hana::eval_if_t::operator()(Cond&&, Then&&, Else&&) const [with Cond = const bool&; Then = f2(const arg_t&) [with arg_t = int]::<lambda(auto:1)>&; Else = f2(const arg_t&) [with arg_t = int]::<lambda(auto:2)>&]’ before deduction of ‘auto’ 
    return eval_if(b, wrapper_case, default_case); 
      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

有沒有遞歸,我使用gcc-6.0.2,它大概已經解決了關於decltype(auto)的一些錯誤,並且具有完整的C++ 14實現,並且符合boost::hana的要求,所以,我的錯誤必須在我的實現中,但我不知道什麼是關於的錯誤。

注意:鏗鏘聲++ 3.8.0會拋出類似的編譯器錯誤。

回答

4

首先,如果路徑沒有說清楚,boost/hana/fwd/eval_if.hpp只是一個前向聲明。如果你想認真使用它,你需要包括整個東西,即boost/hana/eval_if.hpp。這是原始錯誤的原因。

然後,該bool是錯誤的:

constexpr bool b = is_a<std::reference_wrapper<std::string>, 
         arg_t>; 

它強制轉換到bool意味着該類型不再攜帶值的信息。使用auto

+0

我雖然有些模板完全在fwd文件中出於某種原因。我剛剛拿到了'hana'文檔中的頭文件。 'b'的問題我還沒有完全理解。 'b'這是一個在編譯時已知的常量值,所以'eval_if'應該按照預期工作。 –

+2

@ Peregring-lk作爲函數參數傳遞時,值的不變性會丟失。它必須嵌入到它的工作類型中。 –

+0

>我剛拿到了頭文件中的頭文件。 @ Peregring-lk你能指點我在哪裏你從那個例子的文件?我想解決它,如果它不明確必須包括'boost/hana/eval_if.hpp'。 –