Templateklasse nur dann sinnvoll, wenn für alle Datentypen gleich anwendbar?
-
Hallo,
ist es denn üblich, dass man auch dann Klassen als Template definiert, wenn man diese nicht universell auf jeden Datentyp anwenden kann, sondern gesondert darauf reagieren muss? Angenommen, ich instanziiere ein Objekt von einer Templateklasse, und lege den Datentyp auf char* fest. Klassenintern kann aber jedoch nur mit Integern gearbeitet werden. Ist es also in so einem Fall sinnvoll, erst mit if(typeid == char)* zu überprüfen, ob es sich um einen String handelt, und wenn ja, diesen per atoi() zu einem Integer umzuwandeln, um dann damit weiterarbeiten zu können?
Danke für Eure Antworten!
-
CodeOriginator schrieb:
ist es denn üblich, dass man auch dann Klassen als Template definiert, wenn man diese nicht universell auf jeden Datentyp anwenden kann, sondern gesondert darauf reagieren muss?
-> Template Spezialisierung:
template<class T> class Yoyo { }; //spezialsiert für char* template<> class Yoyo<char*> { };
-
Also soll ich bei der Template-Spezialisierung meine Klasse doppelt definieren, einmal für das normale Template, und nocheinmal für das spezialisierte?!

-
CodeOriginator schrieb:
Also soll ich bei der Template-Spezialisierung meine Klasse doppelt definieren, einmal für das normale Template, und nocheinmal für das spezialisierte?!

Ja leider. Besser ist es natürlich, wenn du deine Algorithmen allgemein wie möglich hälts und sie auslagerst und es in der normalen Template Klasse und in der spezialisierten dann verwendest ...
Wie sieht dein Code genau aus, was willst du machen ?
-
Wie sieht dein Code genau aus, was willst du machen ?
Bis jetzt steht nur das Klassengrundgerüst. Ich schreibe einen Wrapper 'DateTime', für die <ctime>, dessen Funktionalität um ein paar Klassenmethoden erweitert wird, wie z.B. zwei Daten vergleichen (früher als, später als, gleich). Mein Grundgedanke war der, dass sich die DateTime Klasse möglichst dem Benutzer anpasst, und ich somit auf Templates zurückgreifen werde. So muss sich der Benutzer nicht um das Umcasten zwischen char* und int und umgekehrt kümmern, sondern kann sein Datum bzw. seine Zeitangabe mit dem vorher festgelegten Datentyp übergeben, und erhält das Ergebnis auch dementsprechend in dem selben Datentyp.
Aber mittlerweile ist mir denke ich klar geworden, dass sich ein spezialisiertes Template (und somit zwei Klassen) dafür nicht lohnt. oder?
-
Dafür kann man ja Funktionen (inklusive Operatoren) überladen.
-
Dafür kann man ja Funktionen (inklusive Operatoren) überladen.
Das hätte ich eben als zweite Alternative vorgeschlagen. Eine Templateklasse hätte sich aber trotzdem etabliert, wenn man nicht noch ein spezialisiertes Template daraus machen müsste.
-
Kannst doch auch einfach folgendes machen:
class foo { template<typename T> void bar(T const& data) { std::cout << T << std::endl; } template<> void bar(int const& data) { std::cout << data + 1 << std::endl; } }; int main() { foo inst; inst.bar<double>(0.05); inst.bar<int>(0); }...
-
Ich würde in dem speziellen Fall weder Templates noch Overloads verwenden, da die verschiedenen möglichen Datumsformate nicht 1:1 auf C++ Typen abbildbar sind.
"int" heisst nicht immer "Sekunden seit XYZ" und "char const*" heisst nicht immer ISO 8601 (und selbst ISO 8601 definiert einen HAUFEN verschiedener Formate).