Jak mogę rozszerzyć rzutowanie leksykalne do obsługi wyliczonych typów?

Mam następującą funkcję, która konwertuje ciąg znaków na liczbowy typ danych:

template <typename T>
bool ConvertString(const std::string& theString, T& theResult)
{
    std::istringstream iss(theString);
    return !(iss >> theResult).fail();
}

Nie działa to jednak dla wyliczonych typów, więc 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;
}

(Zakładam, że ciąg ma prawidłową wartość dla wyliczonego typu; używam tego głównie do prostej serializacji)

Czy istnieje sposób na stworzenie jednej funkcji, która łączy oba te elementy?

Grałem trochę z argumentami szablonu, ale nic nie wymyśliłem; byłoby miło, gdyby nie trzeba było wywoływać jednej funkcji dla wyliczonych typów, a innej dla wszystkiego innego.

Dziękuję Ci

questionAnswers(2)

yourAnswerToTheQuestion