2013-04-22 68 views
7

我有一個函數getTotal:捕獲打破我lambda函數

int getTotal(const HitMap& hitMap, bool(*accept)(int chan)) 

其中第二個參數是其中容器hitMap成員應該被添加到總的一個bool功能指定。

我試圖用lambda來調用它。這工作:

auto boxresult = 
getTotal(piHits, [](int pmt)->bool 
{ return (pmt/100) == 1;}); 

但這並不:

int sector = 100; 
auto boxresult = 
getTotal(piHits, [sector](int pmt)->bool 
{ return (pmt/sector) == 1;}); 

我從我的編譯器(GCC 4.6.3)得到錯誤

cannot convert ‘main(int, char**)::<lambda(int)>’ to ‘bool (*)(int)’ 
for argument ‘2’ to ‘int getTotal(const HitMap&, bool (*)(int))’ 

。我試過[&sector][=sector],但沒有任何區別。

我在做什麼錯?

+5

只有未捕獲的lambdas可以轉換爲函數*指針*。期。 – Xeo 2013-04-22 11:27:12

回答

15

當一個lambda有一個capture子句時,它不能再被當作一個函數指針。爲了校正,使用std::function<bool(int)>作爲參數類型getTotal()

int getTotal(const HitMap& hitMap, std::function<bool(int)> accept) 
+4

或...一個模板。 – Xeo 2013-04-22 11:29:05

+1

感謝'template int getTotal(const HitMap&hitMap,F accept)'工作。你有鏈接,我可以閱讀爲什麼它不同於函數指針? – 2013-04-22 11:36:38

+0

哦,[this](http://stackoverflow.com/a/7852154/1527126)是有道理的。 – 2013-04-22 11:43:28

3

與捕獲lambda函數是不是你所期望的,可以使用以下方法:

template <typename F> 
int getTotal(const HitMap& hitMap, F accept) 
{ 

} 

int getTotal(const HitMap& hitMap, std::function<bool(int)> accept) 
{ 

} 

基於getTotal的模板具有更好的性能。 Read more