2013-04-22 12 views
7

Mam getTotal funkcję:Przechwytywanie łamie moja funkcja lambda

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

gdzie drugi argument jest funkcja określająca bool której członkowie hitMap pojemnika należy dodać do całości.

Próbuję wywołać to z lambda. To działa:

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

ale to nie:

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

pojawia się błąd

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

z mojego kompilator (gcc 4.6.3). Próbowałem [&sector] i [=sector], ale nie miało to znaczenia.

Co robię źle?

+5

Tylko niezapisujące lambdy można przekonwertować na funkcję * wskaźnik *. Kropka. – Xeo

Odpowiedz

15

Gdy lambda ma klauzulę przechwytywania, nie można jej już traktować jako wskaźnika funkcji. Aby skorygować, należy std::function<bool(int)> jako typ argumentu dla getTotal():

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

Lub ... szablon. – Xeo

+1

Dzięki 'szablon int getTotal (const HitMap i hitMap, F zaakceptuj)' działa. Czy masz link, w którym mogę przeczytać, dlaczego jest inny ze wskaźnikami funkcji? –

+0

Oh, [this] (http://stackoverflow.com/a/7852154/1527126) ma sens. –

3

Funkcja lambda z przechwytywania nie jest to, czego można oczekiwać, można użyć następujących sposobów:

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

} 

lub

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

} 

Szablon oparty na getTotal ma lepszą wydajność. Read more.

Powiązane problemy