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).
-
Implicit template parameters hättest du auch gerne, was?