Funktion mit mehreren Rückgabetypen
-
Hallo!
Ich möchte eine Funktion schreiben, die aus einer XML-Datei werte ausliest. Das Problem ist, das nicht alle Werte vom gleichen Datentyp sind. Wie schaffe ich es, diese Funktion so zu deklarieren, dass die Rückgabetypen unterschiedlich sind?
ich hab mir das so ungefähr vorgestellt, geht natürlich nicht, aber vielleicht als Denkanstoß, was ich mir vorstelle:
int getMapInfo( const std::string filePath, const std::string value ) { TiXmlDocument Doc( filePath.c_str() ); Doc.LoadFile(); TiXmlNode* InfoNode = Doc.FirstChild( "metainfos" ); TiXmlElement* mapInfo = InfoNode->FirstChildElement( value.c_str() ); return StrToInt( mapInfo->GetText() ); } std::string getMapInfo( const std::string filePath, const std::string value ) { TiXmlDocument Doc( filePath.c_str() ); Doc.LoadFile(); TiXmlNode* InfoNode = Doc.FirstChild( "metainfos" ); TiXmlElement* mapInfo = InfoNode->FirstChildElement( value.c_str() ); return mapInfo->GetText(); }Ich würde mich freuen, wenn ihr mir da helfen könntet, denn die Alternative ein Struct zurück zu geben ist mir irgendwie zu unelegant.
Mit freundlichen Grüßen
Kasimir
-
Du musst entweder eine Gemeinsamkeit finden, um die Typen abstrakt ansprechen zu können, oder sie explizit unterscheiden. Als Gemeinsamkeit bietet sich eine abstrakte Basisklasse an, die virtuelle Funktionen anbietet. Da
intundstd::stringschon fertig sind, musst du sie wrappen. Die andere Möglichkeit wäre eben eingetIntMapInfo()undgetStringMapInfo().Oder wie stellst du dir bei dem statischen Typsystem von C++ vor, je nachdem einen anderen Typen zu haben? Deklarieren und alles musst du ja auch.
-
Um diese Uhrzeit zu Schreiben sollte ich wohl lassen
ich beraff das alles nicht mehr was ich mache 
Ich denke, Deine letzte Idee war die beste, einfach eine getStringMapInfo() und ein int Äquivalent zu schreiben.
Viele Dank für den Denkanstoß!
-
Kasimir87 schrieb:
Ich denke, Deine letzte Idee war die beste, einfach eine getStringMapInfo() und ein int Äquivalent zu schreiben.
Es ist die naheliegendste. Aber die beste? So musst du im Code eingravieren, ob nun ein
intoderstd::stringals nächstes kommt und hast keine Änderungsmöglichkeiten zur Laufzeit mehr. Fehlerbehandlung, falls dann doch etwas anderes kommt, musst du auch einbauen.Kann aber gut sein, dass das überhaupt nichts ausmacht. Nur so...
