2012-08-08 217 views
17

使用升壓適配器我試圖編譯的代碼:與C++ 11 lambda表達式

#include <boost/range/adaptors.hpp> 
#include <boost/range/algorithm.hpp> 
#include <vector> 

int main() { 
    std::vector<int> v{ 
     1,5,4,2,8,5,3,7,9 
    }; 
    std::cout << *boost::min_element(v | boost::adaptors::transformed(
      [](int i) { return -i; })) << std::endl; 
    return 0; 
} 

編譯失敗,出現以下錯誤消息(長模板實例新穎後):

/usr/local/include/boost/iterator/transform_iterator.hpp:84:26: error: use of deleted function ‘main()::<lambda(int)>::<lambda>()’ 
../main.cpp:12:5: error: a lambda closure type has a deleted default constructor 

我搜索了這個問題,並在Boost Users郵件列表存檔中找到this。它建議使用#define BOOST_RESULT_OF_USE_DECLTYPE可以解決問題。我把它放到我的代碼的開頭,但它仍然不能編譯。錯誤消息的長度似乎要短得多,但最後的錯誤消息是相同的。我目前正在使用Boost 1.50。

這裏有什麼問題?有什麼辦法可以做到這一點?

+0

我認爲你需要1.51。至少這是爲我工作的原因。 – Gurgeh 2012-10-01 15:21:01

回答

8

http://smellegantcode.wordpress.com/2011/10/31/linq-to-c-or-something-much-better/

但是你可以使用這個,那個效果很好。

#include <boost/range/adaptors.hpp> 
#include <boost/range/algorithm.hpp> 
#include <vector> 
#include <functional> 

int main() { 
    std::vector<int> v{ 
     1,5,4,2,8,5,3,7,9 
    }; 
    std::function<int(int)> func = [](int i) { return -i; }; 
    std::cout << *boost::min_element(v | boost::adaptors::transformed(
    func)) << std::endl; 
    return 0; 
} 

http://liveworkspace.org/code/b78b3f7d05049515ac207e0c12054c70

#define BOOST_RESULT_OF_USE_DECLTYPE工作正常VS2012爲例。

6

這涵蓋在http://boost.2283326.n4.nabble.com/range-cannot-use-lambda-predicate-in-adaptor-with-certain-algorithms-td3560157.htmlhttps://svn.boost.org/trac/boost/ticket/4189 - 問題是有些算法希望能夠複製構造(和默認構造,並複製分配)它們的謂詞,這不能用lambda來完成。

解決方法是將包裹拉姆達在std::function

*boost::min_element(
    v | boost::adaptors::transformed(std::function<int(int)>(
     [](int i) { return -i; }))); 

我問過(在Inferring the call signature of a lambda or arbitrary callable for "make_function")的方式來寫一個make_function這樣一個可以只寫:

*boost::min_element(
    v | boost::adaptors::transformed(make_function(
     [](int i) { return -i; }))); 
9

您可以通過在其前面放置一個「+」來將非捕獲的lambda轉換爲函數指針。

std::vector<int> v{1,5,4,2,8,5,3,7,9}; 
std::cout << *boost::min_element(v | 
    boost::adaptors::transformed(+[](int i) 
    { 
     return -i; 
    })) << std::endl; 
+0

這對我有效! – 2015-07-17 13:16:22