So konvertieren Sie einen lambda-Ausdruck, um ein std::function mit Vorlagen

Im Grunde, was ich möchte in der Lage sein zu tun ist, nehmen Sie einen lambda-Ausdruck mit einer beliebigen Anzahl von jedem Typ der Parameter und konvertieren es in ein std::function.
Ich habe versucht, die folgenden und weder Methode funktioniert.

std::function([](){});//Complains that std::function is missing template parameters
template <typename T> void foo(function<T> f){}
foo([](){});//Complains that it cannot find a matching candidate

Dem folgenden code funktioniert doch, aber es ist nicht das, was ich will, da es erfordert die explizite Angabe der template-Parameter, die nicht für generischen code.

std::function<void()>([](){});

Ich habe mucking herum mit Funktionen und Vorlagen, die den ganzen Abend und ich kann einfach nicht herausfinden, so dass jede Hilfe wäre sehr geschätzt werden.

Wie bereits erwähnt in einem Kommentar, der Grund, warum ich versuche, dies zu tun ist, weil ich bin versucht zu implementieren currying in C++ mithilfe von variadic templates. Leider scheitert schrecklich, wenn mit lambdas. Ich kann zum Beispiel passieren eine standard-Funktion über einen Funktionszeiger.

template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
    foo(bar);
}

Jedoch kann ich nicht herausfinden, wie man einen lambda-Ausdruck übergeben, um so eine Variable Funktion. Warum bin ich interessiert bei der Umwandlung eine generische lambda in einem std::function ist, weil ich Folgendes tun können, aber es endet zu verlangen, dass ich ausdrücklich die template-Parameter std::function, die ist, was ich versuche zu vermeiden.

template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
    foo(std::function<void()>([](){}));
}
Lambda-Ausdrücke sind nicht besonderes. Sie sind nur von function-Objekten. Und dies ist auch ein function-Objekt: struct foo { void operator()(int); void operator()(std::string); };. Wie würden Sie die Idee für diese Arbeit?
Was wollen Sie erreichen? Könnte Ihnen zeigen, einige pseudo-code?
Ich war eigentlich versucht zu implementieren currying in C++, aber wenn ich dann versucht, Rückschlüsse auf die Parameter eines lambda-mithilfe von variadic templates, alles brach zusammen. Also ich hatte gehofft, wenn ich könnte einfach konvertieren die lambda ein std::function, meine Probleme würden gelöst werden.
Übrigens, sind Sie vertraut mit std::bind?
Ich glaube nicht, dass dieses feature implementiert werden können in einer generischen Art und Weise. Betrachten Sie eine Struktur mit mehreren operator ()s Annahme von unterschiedlichen argument-Typen. Welche Art von std::function sollte es passen?

InformationsquelleAutor retep998 | 2012-11-13

Schreibe einen Kommentar