Was ist der richtige Weg, um eine Funktion zu definieren, die ein int->int
Lambda-Parameter als Referenz?
void f(std::function< int(int) >& lambda);
oder
void f(auto& lambda);
Ich bin mir nicht sicher, ob die letzte Form überhaupt eine legale Syntax ist.
Gibt es andere Möglichkeiten, einen Lambda-Parameter zu definieren?
Sie können keinen auto
-Parameter haben. Sie haben grundsätzlich zwei Möglichkeiten:
Option 1: Verwenden Sie std::function
, Wie Sie gezeigt haben.
Option 2: Verwenden Sie einen Vorlagenparameter:
template<typename F>
void f(F &lambda) { /* ... */}
Option 2 kann in einigen Fällen effizienter sein, da eine potenzielle Heap-Zuweisung für das eingebettete Lambda-Funktionsobjekt vermieden werden kann. Dies ist jedoch nur möglich, wenn f
als Vorlagenfunktion in einem Header platziert werden kann. Es kann auch die Kompilierungszeiten und den Platzbedarf im I-Cache erhöhen, ebenso wie jede Vorlage. Beachten Sie, dass dies möglicherweise auch keine Auswirkungen hat. Wenn das Lambda-Funktionsobjekt klein genug ist, wird es möglicherweise im Objekt std::function
Inline dargestellt.
Ich würde template
verwenden als:
template<typename Functor>
void f(Functor functor)
{
cout << functor(10) << endl;
}
int g(int x)
{
return x * x;
}
int main()
{
auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; };
f(lambda); //pass lambda
f(g); //pass function
}
Ausgabe:
500
1000
100
Ich weiß, dass es 7 Jahre her ist, aber hier ist ein Weg, den niemand sonst erwähnte:
void foo(void (*f)(int)){
std::cout<<"foo"<<std::endl;
f(1); // calls lambda which takes an int and returns void
}
int main(){
foo([](int a){std::cout<<"lambda "<<a<<std::endl;});
}
Welche Ausgänge:
foo
lambda 1
Keine Vorlagen oder std :: -Funktion erforderlich