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 🙄


Anmelden zum Antworten