Typ einer Lambda-Funktion
-
Hallo zusammen,
Ich möchte einer Template-Funktion eine Factory-Funktion übergeben.
Die anderen Parameter kriegen dieses Objekt dann an Member-Funktionen übergeben.
Aus diesen Parametern lässt sich jedoch nicht der genaue Typ ableiten.
Deswegen möchte ich den Rückgabe-Typ aus der übergebenen Funktion ermitteln.
Das funktioniert auch ganz gut, solange ich eine std::function übergebe.
Jetzt möchte ich aber eine Lambda-Funktion übergeben.
Dazu kann ich natürlich ein std::function-Objekt mit Lambda-Funktion erstellen.#include <functional> template<typename T> T create(std::function<T()> function){ return function(); } int main() { std::function<int()> func([]{return 1;}); create(func); //create([]{return 1;}); }Ich frage mich aber, ob es auch direkt geht.
Wenn ich die auskommentierte Zeile mitkompiliere, erhalte ich folgende Fehlermeldung:test.cpp: In function 'int main()':
test.cpp:11:22: error: no matching function for call to 'create(main()::<lambda()>)'
test.cpp:11:22: note: candidate is:
test.cpp:4:3: note: template<class T> T create(std::function<T()>)Von welchem Typ ist eigentlich eine Lambda-Funktion bzw. was kann ich ändern, damit es funktioniert?
Ich würde ungern die Signatur der Funktion in der std::function explizit angeben.
Gruß,
XSpille
-
Den Typ einer Lambda kann man leider nicht hinschreiben. Du wirst wohl das Template-Argument explizit angeben müssen, oder der Lambda ein -> int hinzufügen.
-
314159265358979 schrieb:
Den Typ einer Lambda kann man leider nicht hinschreiben. Du wirst wohl das Template-Argument explizit angeben müssen, oder der Lambda ein -> int hinzufügen.
Schade... Hatte ich befürchtet

Danke

-
XSpille schrieb:
Ich frage mich aber, ob es auch direkt geht.
#include <functional> template<typename Fun> auto create(Fun function) -> decltype(function()) { return function(); } int main() { return create([]{return 0;}); }
-
krümelkacker schrieb:
...
Perfekt!!!

Eigentlich hätte ich da auch selbst drauf kommen können
