Mam następującą funkcję, która będzie przekonwertować ciąg do numerycznej typ danych:Jak mogę rozszerzyć obsadę leksykalną do obsługi typów wyliczeniowych?
template <typename T>
bool ConvertString(const std::string& theString, T& theResult)
{
std::istringstream iss(theString);
return !(iss >> theResult).fail();
}
to nie działa dla wymienionych typów jednak tak zrobiłem coś takiego:
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;
}
(Podejmuję założenie, że ciąg znakówString ma poprawną wartość dla typu wyliczeniowego, używam tego głównie do prostej serializacji)
Czy istnieje sposób utworzenia pojedynczej funkcji, która łączy oba te elementy?
Grałem trochę z argumentami szablonu, ale nie wymyśliłem niczego; byłoby miło, gdyby nie trzeba było wywoływać jednej funkcji dla typów wyliczeniowych i innej dla wszystkiego innego.
Dziękujemy
+1. Miałem też napisać komentarz o tym, dlaczego nie było to w standardowej bibliotece, dopóki nie przeczytam odpowiedzi GMana poniżej. – Jon
Zwiększenie nie jest już potrzebne, ponieważ std :: enable_if i std :: is_enum zapewniają te funkcjonalności w C++ 11 – moala