Template Spezialisierung
-
Ja, z.B. per std::enable_if (SFINAE). Du kannst aber auch das gesamte Klassentemplate explizit spezialisieren. Kommt auf den Fall an.
-
Sicher das du als Template Parameter keinen Typ sondern einen int mit einem bestimmten Wert haben möchtest? Wenn ja dann kann man etwa sowas machen:
#include <type_traits> template<int typ> class A { public: template <int dummy = typ, class T = typename std::enable_if<dummy == 5>::type> void foo() {} }; int main() { A<1> a; A<5> b; //a.foo(); // fehler hier b.foo(); }Hier habe ich std::enable_if mit einem Default Template Parameter gemacht. Man kann es auch in einen der Parameter oder als Rückgabewert packen. Man beachte außerdem die zusätzliche Indirektion (Idee von hier) über die
dummyVariable, damit es bei der Instanzierung vonA<1>nicht sofort einen Compilerfehler gibt. Es gibt aber auch noch andere Möglichkeiten sowas zu erreichen. Hängt davon ab was du genau vor hast.
-
Wenn ich das richtig gesehen habe, gibts das enable_if erst seit VS2010, dann gehts eh nicht und ich krieg auch nen Fehler
"error C4519: Standardvorlagenargumente sind nur für eine Klassenvorlage zulässig.."
ich hab ja schon probiert, was zu konstruieren ala
template<int typ> class A { public: A(){} A(int a, int b); int m; }; template<> A<5>::A(int a, int b) { m = a*b; } int main() { //A<1> eins(1,2); Fehler A<5> zwei(1,2); }Funktionieren tuts, aber obs schön ist ?
MfG
-
CatDog11 schrieb:
Wenn ich das richtig gesehen habe, gibts das enable_if erst seit VS2010, dann gehts eh nicht und ich krieg auch nen Fehler
Ach Gott, du bist noch mit VS2008 oder noch früher unterwegs? Kann oder willst du nicht mal auf etwas neueres umsteigen?
CatDog11 schrieb:
Funktionieren tuts, aber obs schön ist ?
Nein schön ist was anderes. Du hast jetzt den Konstruktor mit zwei Parametern nur für typ = 5 definiert. Daher gibts beim Compilieren dann auch einen Linker Fehler und keinen vom Compiler. Eine andere Möglichkeit wäre noch sowas (geht sogar mit VS2010, früher kann ich nicht testen):
template<int typ> class A { public: A() {} int m; }; template<> class A<5> { public: A(int a, int b) {} }; int main() { A<1> eins(1,2); A<5> zwei(1,2); }Hier ist A<5> jetzt eine Spezialisierung von A. Dies hat allerdings den Nachteil, dass A<5> nichts von der allgemeinen A Klasse übernimmt. Also hat A<5> auch keine Membervariable m. Man könnte aber eine Basisklasse definieren in der alle gemeinsame Funktionen und Member liegen. Hängt wieder davon ab was du überhaupt zu erreichen versuchst.
-
CatDog11 schrieb:
Wenn ich das richtig gesehen habe, gibts das enable_if erst seit VS2010,
also noch mit vc6 unterwegs?
-
CatDog11 schrieb:
"error C4519: Standardvorlagenargumente sind nur für eine Klassenvorlage zulässig.."
Default Template Arguments für Funktionen sind erst seit C++11 erlaubt und in VS erst mit Version 2013 unterstützt.
-
camper schrieb:
CatDog11 schrieb:
Wenn ich das richtig gesehen habe, gibts das enable_if erst seit VS2010,
also noch mit vc6 unterwegs?
Hier gabs mal einen der - angeblich - mit (IIRC) GCC 2.9.3 unterwegs war. Das wolltest du nicht einmal glauben.

-
Ich habe auch ne neue Entwicklungsumgebung im Einsatz, muss aber zum Teil c++/cli dlls erstellen basierend auf .Net 2.0 und da kommt eben VS2008 wieder ins Spiel. Oder kann ich das umgehen irgendwie ?
Das der oben aufgeführte Konstruktor nur für einen Typ funktioniert, wäre ja sogar richtig. Eigentlich könnte ich auch eine Basisklasse schreiben und von der ableiten, aber nachdem sich die Klassen bis auf die Initialisierung nicht unterscheiden, wollt ich eben mal sowas ausprobieren. Vielleicht gibts ja aber auch noch andere Möglichkeiten für so ein Szenario.
MfG
-
CatDog11 schrieb:
Ich habe auch ne neue Entwicklungsumgebung im Einsatz, muss aber zum Teil c++/cli dlls erstellen basierend auf .Net 2.0 und da kommt eben VS2008 wieder ins Spiel. Oder kann ich das umgehen irgendwie ?
Ich hab zwar kaum Ahnung von CLI aber ich kann bei VS2015 immer noch .NET 2.0 auswählen (hoffentlich nicht nur weil ich VS2010 noch parallel installiert habe).
-
Framwork Auswählen ? Bei C-Sharp oder VB kann ich das Framework auswählen, aber bei c++/cli doch nicht oder lieg ich da falsch ? Ich weiss nur, daß man es handisch in der Projektdatei ändern kann, aber selbst dann muss es mit doch mit dem Platform Toolset zusammenpassen oder nicht ?
MfG