decltype(T::operator()()) für Klassen-Template-Parameter T



  • Hallo zusammen,

    ich möchte einen typedef innerhalb einer Klasse definieren, der abhängig ist von dem Rückgabe-Typ einer Funktion, die als Template-Parameter an die Klasse übergeben wird. (EDIT: Klar ist die Funktion nicht selbst der Template-Parameter)

    Also ich meine etwa so etwas:

    template<typename T>
    struct Foo{
    
    	typedef decltype(_t()) type;
    	//typedef decltype(T::operator()()) type;
    	Foo(T t) : _t(t){}
    
    	type operator()(){ return _t(); }
    
    	T _t; // <- HIER
    };
    
    template<typename T>
    Foo<T> create_foo(T t){
    	return Foo<T>(t);
    }
    
    int main() {
    	auto t = create_foo([](){return 'x';});
    	char c = t();
    }
    

    Generell habe ich meine member-Variablen immer als letztes in meiner Klasse und die typedefs am Anfang. (Also ganz einfach persönlicher Stil) Diesen Code akzeptiert mein Compiler GCC 4.6.1 nicht, solange ich die markierte Zeile nicht vor das typedef ziehe, was allerdings eigentlich gegen meine persönliche Reihenfolge innerhalb einer Klasse/struct verstößt.

    Bei Verwendung der auskommentierten Zeile erhalte ich ein:

    test.cpp: In instantiation of 'Foo<main()::<lambda()> >':
    test.cpp:21:39: instantiated from here
    test.cpp:6:36: error: cannot call member function 'main()::<lambda()>' without object
    test.cpp: In function 'int main()':
    test.cpp:22:13: error: no match for call to '(Foo<main()::<lambda()> >) ()'

    Klar hat der Compiler recht, dass ich ihm kein Objekt für den Funktionsaufruf zur Verfügung gestellt habe, allerdings sollte doch der Rückgabetyp - solange keine Template-Funktion - immer(?) abhängig von der Klasse sein, so dass er sie ermitteln könnte, oder?

    Gibt es eine Möglichkeit ohne Reihenfolgeänderung?

    Gruß,
    XSpille


  • Mod

    typedef decltype(std::declval<T>()()) type;
    

    würde sich anbieten.



  • camper schrieb:

    typedef decltype(std::declval<T>()()) type;
    

    würde sich anbieten.

    Stimmt...
    Auf declval hast du mich schonmal aufmerksam gemacht... (EDIT: Naja... krümelkacker wars 🙂 )

    Perfekt!!! 👍



  • Es gibt auch noch result_of:

    typename std::result_of<T()>::type
    


  • krümelkacker schrieb:

    Es gibt auch noch result_of:

    typename std::result_of<T()>::type
    

    DANKE!!! 👍


Anmelden zum Antworten