2016-11-28 13 views
9

Chciałbym użyć lambda jako parametru dla funkcji C++, ale nie wiem, który typ określić w deklaracji funkcji. Co chciałbym zrobić to w ten sposób:Użyj lambda jako parametru dla funkcji C++

void myFunction(WhatToPutHere lambda){ 
    //some things 
} 

Próbowałem void myFunction(auto lambda) i void myFunction(void lambda) ale żaden z tych kodów skompilowany. Jeśli to ma znaczenie, lambda niczego nie zwraca.

Jak mogę użyć lambda jako parametru w funkcji C++?

+3

Użyj 'std :: funkcję <>' parametru. –

+0

semi dupe: http://stackoverflow.com/questions/28746744/passing-lambda-as-function-pointer. próbując znaleźć lepszą. – NathanOliver

Odpowiedz

12

Masz 2 sposoby: make szablonu funkcję:

template <typename F> 
void myFunction(F&& lambda){ 
    //some things 
} 

lub usunąć typ z std::function

void myFunction(const std::function<void()/* type of your lamdba::operator()*/>& f){ 
    //some things 
} 
+1

Należy zauważyć, że ten pierwszy generuje nowy klon funkcji dla każdej innej wartości lambda, która jest przekazywana do niego w całym programie i nie może być łatwo wykorzystany (prawdopodobnie wcale) dla funkcji, które chcesz zdefiniować w oddzielnej jednostce kompilacji . –

+2

Należy zauważyć, że drugie rozwiązanie spowoduje pewne obciążenie środowiska wykonawczego i dokona alokacji dynamicznej. Ponieważ pierwsze rozwiązanie jest tak szybkie, jak gdybyś umieścił zawartość w lambda wewnątrz 'myFunction' –

7

Masz dwie opcje, zasadniczo.

Zrób to szablon:

template<typename T> 
void myFunction(T&& lambda){ 
} 

lub, jeśli nie chcą (lub nie mogą) to zrobić, można użyć typu skasowane std::function:

void myFunction(std::function<void()> const& lambda){ 
} 

I odwrotnie, twoja próba z auto byłaby poprawna pod koncepcjami TS, jakie są obecnie implementowane w gcc, gdzie byłby to abbreviated template.

// hypothetical C++2x code 
void myFunction(auto&& lambda){ 
} 

lub z pojęciem:

// hypothetical C++2x code 
void myFunction(Callable&& lambda){ 
} 
0

Jeśli jest to funkcja inline wolą szablon, jak w

template<typename Func> 
void myFunction(Func const&lambda) 
{ 
    //some things 
} 

, ponieważ wiąże się z wszystkiego, co ma sens (i będzie przyczyną błędu kompilatora dla czegokolwiek innego), w tym lambdami, instancjami nazwanych klas i obiektami std::function<>. Z drugiej strony, jeśli ta funkcja nie jest inline, tj. Zaimplementowana w jakiejś jednostce kompilacji, nie można użyć ogólnego szablonu, ale musi on używać określonego typu, który najlepiej jest podnieść jako obiekt std::function<> i przekazać za pośrednictwem odwołania.

Powiązane problemy