2012-10-21 34 views
2

我試圖根據帶參數的lambda函數調用boost::phoenix::function並失敗。如果我以這樣的方式將它稱爲不帶參數:無法通過boost調用具有參數的懶惰lambda函數:: phoenix :: function

const auto closure = [](){ 
    cout<< "test" << endl; 
}; 

typedef decltype(closure) ClosureType; 
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure)); 
lazyFunc()(); 

所有編譯好。但是,當我宣佈拉姆達的至少一個參數:

const auto closure = [](int& param) { cout<<"Test" << param << endl; }; 

typedef decltype(closure) ClosureType; 
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure)); 
lazyFunc(arg1)(a); 

編譯失敗,巨大的堆棧跟蹤深裏boost::result_of

回答

2

假設錯誤點,在內心深處Boost.ResultOf(如圖this demo)那是因爲lambda表達式的閉包類型沒有實現ResultOf協議。

一個稍微簡單的解決方法是定義BOOST_RESULT_OF_USE_DECLTYPE,這使得boost::result_of跳過它自己的ResultOf協議,而不是使用decltype來計算返回類型。這並不是默認啓用的,因爲沒有太多的編譯器(在發佈Boost 1.51時)足以滿足此功能的需求;計劃爲符合1.52的編譯器自動定義此符號(由Boost.Config定義)。

Here是使用Boost.Phoenix與decltype-poweredow boost::result_of的演示。我必須將int&更改爲int const&,因爲i顯然是作爲const int轉發。這似乎是boost::phoenix::function的一個基本限制,使用boost::phoenix::val沒有這個問題。