Template Problem (wen wunderts :D)
-
Hi,
ich habe eine Vectorklasse auf Templatebasis, das funktioniert auch PRIMA!
Aber eine Funktion in der Klasse soll auf den Datentyp "float" anders reagieren als auf andere Datentypen:
hier ist sie:
template <typename T> class vector { public: // Constructors vector (void): x(0), y(0), z(0) , w(1) {}; vector (T x_, T y_, T z_, T w_ = 1) : x(x_), y(y_), z(z_), w(w_) {}; vector (const vector<T> &other) :x(other.x), y(other.y), z(other.z), w(other.w) {}; inline const float length (void) { // Paar Assemblerroutinen in SIMD und co } inline const T length (void) { return (static_cast<T>(sqrt(x*x + y*y + z*z))); } ...
wie schon gesagt, bei flaot soll die Funktion "length" anders reagieren als auf z.B. double.
Wie macht man das?
-
Template-Spezialisierung
template<typename T> class a { }; template<> class<float> class a { };
Das geht aber wohl nicht mit veralteten Compilern, wie dem MSVC6
btw. benutz bitte bessere Topics: wmfrs
-
probier mal sowas:
template<class T> class Foo{ private: void internalLength(T& obj){ obj=static_cast<T>(sqrt(x*x + y*y + z*z)); } void internalLength(float& obj){ //für float } public: inline T length (){//das muss nicht unbedingt const sein, aufjedenfall nicht bei elementaren datentypen T value; internalLength(value); return value; } };
is en bissl holprig, du könntest auch für float eine template spezialisierung basteln, aber für eine methode ist das ein bischen heftig.
ansonsten frag mal Hume, der weis sicher noch ne gute alternative
-
@kingruedi
naja für 1 funktion ist das zu viel@otze:
danke aber ginge doch bestimmt noch besser oder?HUMME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *bitte hilf*
-
Die Idee von otze ist recht nett, man könnte es aber auch mit einer Basisklasse und Spezialisierung machen, zB
template <class T> class foo_base { // hier alle Sachen rein, die allgemein gültig sind }; template <class T> class foo : public foo_base<T> { }; template <> class foo<float> : public foo_base<float> { // hier alle Sachen rein, die speziell für float angepasst werden sollen };
-
kingruedi schrieb:
Template-Spezialisierung
template<typename T> class a { }; template<> class<float> class a { };
Die korrekte Syntax wäre:
template <> class a<float> {...};
Das geht aber wohl nicht mit veralteten Compilern, wie dem MSVC6
Vollständige Spezialisierung geht auch auf dem VC 6.0. Ältere Compiler (wie der VC 6.0) haben in der Regel nur mit partieller Spezialisierung ein Problem.
is en bissl holprig, du könntest auch für float eine template spezialisierung basteln, aber für eine methode ist das ein bischen heftig
Du musst ja nicht das ganze Template spezialisieren. Es reicht die eine Methode:
template<class T> class Foo{ private: ... public: inline T length () const // const-correctness ist eine feine Sache { // Allgemeiner Fall } }; template <> inline float Foo<float>::length() const { // Spezialisierung für T = float }
HUMME!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! *bitte hilf*
Ein 'm' und ein '!' reicht. Bist du sicher, dass wirklich nur die length-Methode anders implementiert werden muss?
-
Humi, man sagt nicht um sonst das du der wahre 1337 des boards bist
Vielen dank