2016-11-28 2 views
9

Ich möchte ein Lambda als Parameter für eine C++ - Funktion verwenden, aber ich weiß nicht, welchen Typ in der Funktionsdeklaration angeben. Was würde Ich mag es, dies zu tun:Verwenden Sie ein Lambda als Parameter für eine C++ - Funktion

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

Ich habe versucht, void myFunction(auto lambda) und void myFunction(void lambda) aber keines dieser Codes zusammengestellt. Falls es darauf ankommt, gibt das Lambda nichts zurück.

Wie kann ich ein Lambda als Parameter in einer C++ Funktion verwenden?

+3

Verwenden Sie eine 'std :: function <>' Parameter. –

+0

semi dupe: http://stackoverflow.com/questions/28746744/passing-lambda-as-funktions-pointer. versuchen, einen besseren zu finden. – NathanOliver

Antwort

12

Sie haben 2 Möglichkeiten: Ihre Funktion Vorlage machen:

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

oder Typ löschen mit std::function

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

Beachten Sie, dass ersteres einen neuen Klon Ihrer Funktion für jedes unterschiedliche Lambda erzeugt, das Sie ihm während Ihres gesamten Programms übergeben, und nicht einfach (wahrscheinlich gar nicht) für Funktionen verwendet werden kann, die Sie in einer separaten Kompilierungseinheit definieren möchten . –

+2

Beachten Sie, dass die zweite Lösung zu einem erheblichen Mehraufwand für die Laufzeit führt und eine dynamische Zuweisung durchführt. Wie die erste Lösung ist so schnell, als wenn Sie den Inhalt auf das Lambda in 'myFunction' setzen –

7

Sie haben grundsätzlich zwei Möglichkeiten.

es eine Vorlage Marke:

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

oder, wenn Sie nicht wollen (oder nicht) das tun, können Sie typ gelöscht std::function verwenden:

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

Umgekehrt wäre Ihr Versuch mit auto unter den Konzepten TS korrekt gewesen, wie es derzeit in gcc implementiert ist, wo es ein wäre.

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

oder mit einem Konzept:

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

Wenn dies ein inline Funktion ist, bevorzugen eine Vorlage, wie in

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

, weil es alles bindet, die Sinn macht (und wird Ursache Compiler-Fehler für alles andere), einschließlich Lambdas, Instanzen von benannten Klassen und std::function<> Objekte. Wenn diese Funktion nicht inline ist, d. H. In einer Kompilierungseinheit implementiert ist, können Sie keine generische Vorlage verwenden, sondern müssen einen angegebenen Typ verwenden, der am besten ein std::function<>-Objekt ist und über Referenz übergeben wird.

Verwandte Themen