constexpr ausnutzbar für pointer to member function type deduction?



  • Hallo, ich spielte hier gerade mal so herum und fragte mich, ob denn constexpr nicht irgendwie dafür ausgenutzt werden kann, um die Template-Parameter-Suche von Funktionen auf die Template-Argument-Liste eines Typs herzunehmen.
    Erm, wenn mir die Worte dazu einfielen, wäre das glaube ich verständlicher, das ist so natürlich nicht richtig ausgedrückt.

    Blödes Beispiel:

    template< typename T >
    struct foo {
    	T operator()(std::string id, up::member::visibility_types vis)
    	{
    		return T(std::move(id), vis);
    	}
    };
    
    template< typename Class, typename T >
    constexpr auto auto_integer(T (Class::*Getter)() const, void (Class::*Setter)(T), bool AutoEvents)
    {
    	return foo<up::adapters::method_integer<Class, T, Getter, Setter, nullptr, AutoEvents>>();
    }
    
    namespace {
    	using short_member = up::adapters::method_integer<sample_struct, short, &sample_struct::get_short, &sample_struct::set_short, nullptr, true >;
    	using float_member = up::adapters::method_real   <sample_struct, float, &sample_struct::get_float, &sample_struct::set_float, true >;
    
    	auto sample_struct_class =
    		up::static_class< sample_struct >(
    			"up.sample_struct",
    			up::bases<some_base, some_base2>(),
    
    // ->
    			auto_integer(&sample_struct::get_short, &sample_struct::set_short, true)("short_val", up::member::visibility_types::Public),
    // <-
    
    			short_member("short_val", up::member::visibility_types::Public),
    			float_member("float_val", up::member::visibility_types::Public)
    			);
    }
    

    Compiler sagt: nee! Gibt's da vielleicht irgendeinen Trick?



  • Ich habe nicht Verstanden was du erreichen möchtest. Für mich sieht es so aus als ob in deiner markierten Zeile die Funktion auto_integer aufgerufen wird, das gibt irgendein Funktionsobjekt zurück, welches dann auch mit irgendwelchen Parametern aufgerufen wird. Und dann landet das alles in den Parametern für den Konstruktor von static_class. Wofür soll man da jetzt constexpr brauchen? Was für eine Fehlermeldung gibts beim compilieren?



  • Nun, der Gedanke war der, dass man ja beim Template immer

    template< typename T, typename S, S (T::*Ptr)() >
    

    schreiben muss, obwohl ja eigentlich ein Memberpointer alle Informationen für die ersten zwei Parameter schon beinhaltet.
    Also wollte ich eine constexpr-Funktion schreiben, die eben per Matching die ersten beiden Parameter (Typen) aus den Compile-Zeit-Zeigern herausfischt, um sie dann in's Template einzusetzen.
    Der Compiler aber sagt, dass die Funktionsparameter der constexpr-Funktion keine gültigen Argumente für den Template-Typ method_integer sind (Also was in Getter und Setter landet).


  • Mod

    Implicit template parameters hättest du auch gerne, was?


Anmelden zum Antworten