Ich habe die folgende Funktion, die einen String in einen numerischen Datentyp konvertieren:Wie kann ich einen lexikalischen Cast erweitern, um Aufzählungstypen zu unterstützen?
template <typename T>
bool ConvertString(const std::string& theString, T& theResult)
{
std::istringstream iss(theString);
return !(iss >> theResult).fail();
}
Das funktioniert nicht für Aufzählungstypen, aber so habe ich so etwas getan:
template <typename T>
bool ConvertStringToEnum(const std::string& theString, T& theResult)
{
std::istringstream iss(theString);
unsigned int temp;
const bool isValid = !(iss >> temp).fail();
theResult = static_cast<T>(temp);
return isValid;
}
(Ich mache die Annahme, dass theString einen gültigen Wert für den Aufzählungstyp hat; ich verwende das hauptsächlich für einfache Serialisierung)
Gibt es eine Möglichkeit, eine einzelne Funktion zu erstellen, die beide kombiniert?
Ich habe ein wenig mit den Vorlagenargumenten gespielt, aber habe nichts gefunden; es wäre nur schön, wenn man nicht eine Funktion für aufgezählte Typen und eine andere für alles andere aufrufen müsste.
Vielen Dank
+1. Ich war auch dabei, einen Kommentar darüber zu schreiben, warum dies nicht in der Standardbibliothek war, bis ich GMans Antwort unten las. – Jon
boost wird nicht mehr benötigt, da std :: enable_if und std :: is_enum diese Funktionalitäten in C++ bieten 11 – moala