PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : foo test = getAttribute("TestAtt") automatisch casten nach 'foo'



lisan
26-01-2005, 13:40
Hi,

Ich parse ein xml dokument. Ich erhalte dabei immer Strings.
Leider stehen diese string in unterschiedlichem kontext, mal ist der geparste string ein double, mal ein int mal ein string.

Wie kann ich solche dinge erreichen:

int test_int = getAttribute("Ein Integer");
double test_double = getAttribute("Ein Double");

Es ist soweit ich das kenne in C++ nicht moeglich zweimal die methode getAttribute zu impl.

ala

double getAttribute(std::string);
und
int getAttribute(std::string);

Gruss,
Arvid.

locus vivendi
26-01-2005, 15:12
double getAttribute(std::string);
und
int getAttribute(std::string);
So direkt geht das nicht. Aber du kannst dir vermutlich helfen wenn du eine Klasse mit mehreren Typkonvertierungs-Operatoren definierst. Findet dann eine Zuweisung oder Initialisierung statt, der du als Argument ein Objekt dieser Klasse übergibst, wird dann automatisch einer dieser Operatoren aufgerufen. Also ungefähr so etwas:
struct overload_return_helper
{

overload_return_helper()
{
}


overload_return_helper(std::string const& str) : m_str(str)
{
}

operator double() const
{
std::stringstream sstr;
sstr << m_str;
double result;
sstr >> result;
return result;
}

operator int() const
{
std::stringstream sstr;
sstr << m_str;
int result;
sstr >> result;
return result;
}

operator std::string() const
{
return m_str;
}

std::string m_str;
};

Ich würde dir aber nicht unbeding dazu raten, weil diese Lösung doch meistens Ineffizienter sein dürfte, als wenn man einfach verschieden benannte Funktionen benutzt.

Vielleicht kannst du die Werte ja auch einfach übergeben, indem die Funktion ein Argument als Referenz erwartet. Dann kannst du wieder ganz einfach überladen.

anda_skoa
27-01-2005, 16:49
Du kannst zum Beispiel einen weiteren Parameter in die Signatur aufnehmen.



int getAttribute(const std::string& s, int defaultValue);

Das hat zusätzlich den Vorteil, dass die bestimmen kannst, welcher Wert zurückkommt, auch wenn das XML Attribut nicht vorhanden war.

Ciao,
_