2014-10-27 127 views
0

我使用匿名函數(也稱爲lambda)作爲find_if的條件。顯然我可以爲它製作一個特殊的類,但是C++ 11說我可以使用匿名函數。 但是,爲了便於閱讀和理解,我決定將匿名函數保存在作爲函數鍵入的局部變量中。保存一個匿名函數(lambda)作爲函數型變量

不幸的是,我得到的錯誤:

no match for call to '(std::function<bool(Point*, Point*)>) (Point*&)' 
note: candidate is: 
note: _Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = bool; _ArgTypes = {Point*, Point*}] 
note: candidate expects 2 arguments, 1 provided 

我到底做錯了什麼?所謂的候選人對我來說是希臘人。 我試圖將lambda直接放在find_if-invokement中,但那也不起作用。

#include <vector> 
#include <function> 
#include <algorithm> 

using std::vector; 
using std::function; 
using std::find_if; 

Point* Path::getPoint(int x, int y) 
{ 
    function<bool(Point*, Point*)> howToFind = [&x, &y](Point* a, Point* b) -> bool 
    { 
     if(a->getX() == x) 
     { 
      return true; 
     } 
     else if(a->getX() < b->getX()) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    }; 

    vector<Point*>::iterator foundYa = find_if(this->points.begin(), this->points.end(), howToFind); 

    if(foundYa == points.end()) 
    { 
     return nullptr; 
    } 

    return *foundYa; 
} 


代碼cnicutar的有用的答案後,修正部分。我曾在其他地方需要修改我的代碼,但是這超出了這個問題的範圍:

function<bool(Point*)> howToFind = [&x, &y](Point * a) -> bool 
{ 
    if(a == nullptr) 
    { 
     return false; 
    } 
    else 
    { 
     if(a->getX() == x && a->getY() == y) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
}; 

回答

2

根據cppreference功能必須是UnaryPredicate,即它必須採取的一個參數。

template< class InputIt, class UnaryPredicate >  
InputIt find_if(InputIt first, InputIt last, 
        UnaryPredicate q); 
+0

我明白了。 所以lambda的語法是正確的,但lambda的參數在給定的上下文中是不正確的。 – RoestVrijStaal 2014-11-10 18:33:12