wake-up-neo.com

Verwenden Sie ein Lambda als Parameter für eine C++ - Funktion

Ich möchte ein Lambda als Parameter für eine C++ - Funktion verwenden, weiß jedoch nicht, welcher Typ in der Funktionsdeklaration angegeben werden soll. Was ich gerne machen würde ist folgendes:

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

Ich habe void myFunction(auto lambda) und void myFunction(void lambda) ausprobiert, aber keiner dieser Codes wurde kompiliert. Wenn es wichtig ist, gibt das Lambda nichts zurück.

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

14
Donald Duck

Sie haben zwei Möglichkeiten: Erstellen Sie Ihre Funktionsvorlage:

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

oder Typ mit std::function löschen

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

Sie haben grundsätzlich zwei Möglichkeiten.

Machen Sie eine Vorlage:

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

oder, wenn Sie das nicht wollen (können oder können), können Sie den Typ-gelöschten std::function verwenden:

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

Umgekehrt wäre Ihr Versuch mit auto unter den derzeit in gcc implementierten Konzepten TS korrekt gewesen, wobei es sich um eine abgekürzte Vorlage handeln würde.

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

oder mit einem Konzept:

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

Wenn dies eine inline-Funktion ist, bevorzugen Sie eine Vorlage, wie in

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

weil es an alles bindet, was Sinn macht (und Compiler-Fehler für alles andere verursacht), einschließlich Lambdas, Instanzen benannter Klassen und std::function<>-Objekte.

Wenn diese Funktion jedoch nicht inline ist, d. H. In einer bestimmten Übersetzungseinheit 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 per Verweis übergeben wird.

0
Walter