Variablen Datentyp zurückgeben
-
Ich möchte mir eine Klasse schreiben, welche variable Datentypen verwaltet. Unter anderem für eine eigene Array Klasse. Folgenden Ansatz habe ich:
class Mixed { private: int intVal; float floatVal; bool boolVal; char charVal; string strVal; char type; public: Mixed(int val) { this->intVal = val; this->type = 'i'; } Mixed(float val) { this->floatVal = val; this->type = 'f'; } Mixed(bool val) { this->boolVal = val; this->type = 'b'; } Mixed(char val) { this->charVal = val; this->type = 'c'; } Mixed(string val) { this->strVal = val; this->type = 's'; } };Jetzt kann ich für alle Datentypen eine jeweilige Return Funktion schreiben und mit this->type auswählen, aber das geht bestimmt auch effektiver..
-
hoi
vielleicht mit nem union
Meep Meep
-
union dürfte mit std::string schwer werden.
@Meep, was war doch gleich die Frage ?
-
Templates?!
-
Und wenn es zur Laufzeit sein muss verwende boost::any
-
Oder nen Pointer auf void?
Dann müsste man halt ein struct draus machen
wo auch noch drinsteht welcher Datentyp es sein soll.Eine Union würde doch auch mit nem string gehn
.Aber eigentlich zuviel Aufwand und zuviel gefrickel.
Templates, wofür programmiert man sonst C++...
-
Storm.Xapek.de schrieb:
Oder nen Pointer auf void?
Nee, das wäre doch sehr unschön.
Storm.Xapek.de schrieb:
wo auch noch drinsteht welcher Datentyp es sein soll.
Damit muss man sich aber zwangsweise auf wenige ausgewählte Typen beschränken.
Storm.Xapek.de schrieb:
Eine Union würde doch auch mit nem string gehn
.Ne geht nicht.
Storm.Xapek.de schrieb:
Aber eigentlich zuviel Aufwand und zuviel gefrickel.
ganz genau

Storm.Xapek.de schrieb:
Templates, wofür programmiert man sonst C++...
eben

-
Maurice Ch. schrieb:
...
class Mixed { private: int intVal; float floatVal; bool boolVal; char charVal; string strVal; char type; public: Mixed(int val) { this->intVal = val; this->type = 'i'; } Mixed(float val) { this->floatVal = val; this->type = 'f'; } Mixed(bool val) { this->boolVal = val; this->type = 'b'; } Mixed(char val) { this->charVal = val; this->type = 'c'; } Mixed(string val) { this->strVal = val; this->type = 's'; } };...
Oder
template <typename T> class Mixed { private: T value; public: typedef T value_type; Mixed(T val) : value(val) {} T& get() { return value; } }; // Das Schöne an Funktionstemplates ist, dass sie sich selbst den passenden Typ "raussuchen" template <typename T> Mixed<T> makeMixed(T t) { return t; }Was Dir besser gefällt, kannst Du Dir selbst überlegen .. ich weiß, welches mir besser gefällt.

Gruß,
Simon2.
-
bei der template variante seh ich ein problem mit bestimmten operationen. ganz simpel z.b. der + operator. Mixed + Mixed.
dabei gibts beispielsweise die konvention, dass beide Mixed zu float/int konvertiert und dann addiert werden.
aber was machst du jetzt, wenn einer der Mixed einen datentyp enthält, den du nicht bedacht hast? oder gott bewahre: ein eigener typ.
ohne templates kann man schon bei objekterzeugung dafür sorge tragen, dass nur erlaubte typen verwendet werden.
-
Na, das template würde fordern, das es für die Klasse den operator+ geben muss.
Wenn die Klasse diesen nicht sinvoll zur Verfügung stellen kann, wird das template fehlschlagen.
Das wird aber auch eine Klasse wie am Anfang gezeigt, denn eine Klasse die Du nicht bedacht hast, wird auch bei dieser nicht funkionieren.
Ich sehe hier also nicht den Nachteil des Templates.
-
thordk schrieb:
bei der template variante seh ich ein problem mit bestimmten operationen. ganz simpel z.b. der + operator. Mixed + Mixed....
Da sehe ich gar keinen Unterschied zur "von Hand-Methode". Man muss sich immer genau überlagen, was man mit den Typen machen können soll - und was nicht. Deswegen geht der Trend in C++ ja auch gerade hin zu "stärkeren Typen" ... und dem widerspricht halt das "schwache Typenkonzept" des OPs eigentlich.
Das template erspart letztlich nur "Tipparbeit" ... und sorgt manchmal dafür, dass man Dinge nicht vergisst.
Und wie Knuddl schon sagte: Wenn es keinen passenden operator gibt (geben soll), gibt's auch in der template-Variante einen Compilefehler ...
Gruß,
Simon2.
-
Simon2 schrieb:
Und wie Knuddl schon sagte: Wenn es keinen passenden operator gibt (geben soll), gibt's auch in der template-Variante einen Compilefehler ...
Und das ist der Unterschied - wenn du zwei Mixed-Objekte zusammenfassen willst, die verschiedene Datentypen rumschleppen, merkst du das erst zur Laufzeit.
-
CStoll schrieb:
Simon2 schrieb:
Und wie Knuddl schon sagte: Wenn es keinen passenden operator gibt (geben soll), gibt's auch in der template-Variante einen Compilefehler ...
Und das ist der Unterschied - wenn du zwei Mixed-Objekte zusammenfassen willst, die verschiedene Datentypen rumschleppen, merkst du das erst zur Laufzeit.
Schön ausgedrückt.
(Falls es nicht klar wurde: Ihc bin definitv für den template-Einsatz)In Anlehnung an
thordk schrieb:
...
ohne templates kann man schon bei objekterzeugung dafür sorge tragen, dass nur erlaubte typen verwendet werden.würde ich sogar sagen:
"ohne templates muss man selbst dafür sorge tragen, dass nur erlaubte typen verwendet werden."
(mit templates nimmt einem das der Compiler ab - und der ist IMMER besser in sowas)Gruß,
Simon2.