template non-type parameters: Problem bei static member und static member function
-
Hallo,
ich habe in einem Buch die Aufgabe gefunden:
"Write templates that take non-type parameters of the following variety: an int, a pointer to an int, a pointer to a static class member of type int, and a pointer to a static member function."Die beiden letzten bereiten mir hierbei ein paar Probleme. Mir ist nicht klar, wie ich das im template <...> angeben soll. Ich vermute, dass es im Buch selbst zu finden sein müsste, aber irgendwie habe ich es trotz längerem Suchen einfach nicht (wieder)finden könnte.
Ich hoffe ihr könnt mir hier mit einem kurzen Code Beispiel helfen.Vielen Dank.
-
Meinst du sowas?
template <int i> struct AnInt {}; template <int* i> struct APointerToAnInt {}; class X { public: void f(); static void sF(); int i; static int sI; }; template <void (X::*)()> struct APointerToAMemFunc { }; template <void (*)()> struct APointerToAFunc { }; template < int (X::*) > struct APointerToMember {}; int p = 0; int main() { AnInt<1> anInt; APointerToAnInt<&p> aPointer; APointerToAnInt<&X::sI> aPointerToStaticData; APointerToMember<&X::i> aPointerToMember; APointerToAMemFunc<&X::f> aPtrToMemFunc; APointerToAFunc<&X::sF> aPtrToFunc; }
-
Ach, so könnte das tatsächlich gemeint sein. Ich dachte, ich müsste das template so schreiben, dass es eine specification (ist das auf deutsch eine Spezialisierung oder eine Spezifizierung?) nur auf static mem func resp. static mem sei, also dass es für normale member funktionen nicht funktionnieren sollte.
Vielen Dank!
-
Shinja schrieb:
Ach, so könnte das tatsächlich gemeint sein. Ich dachte, ich müsste das template so schreiben, dass es eine specification (ist das auf deutsch eine Spezialisierung oder eine Spezifizierung?) nur auf static mem func resp. static mem sei
Zwei Dinge:
a) du kannst keine Spezialisierung ausschließlich für statische Memberfunktionen (bzw. statische Daten) einer Klasse schreiben, da sich deren Typ nicht von dem Typ einer freien Funktion unterscheidet. Du schreibst also eine Spezialisierung für eine Funktion und kannst diese dann auch mit einer statischen Memberfunktion instanziieren.b) Eine Spezialisierung für normale Funktionen kann zwar auch mit einer statischen Memberfunktion, nicht aber mit einer normalen Memberfunktion instanziiert werden. Letztere schließen in ihrem Typ immer auch die Klasse zu der sie gehören mit ein. Dein zweiter Gedanke:
also dass es für normale member funktionen nicht funktionnieren sollte.
hat sich somit erledigt.
-
Achso, vielen Dank. Gut zu wissen.