¿Cómo puedo extender una conversión léxica para admitir tipos enumerados?

Tengo la siguiente función que convertirá una cadena en un tipo de datos numérico:

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

Sin embargo, esto no funciona para los tipos enumerados, así que he hecho algo como esto:

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;
}

(Supongo que theString tiene un valor válido para el tipo enumerado; lo uso principalmente para la serialización simple)

¿Hay una manera de crear una sola función que combine ambos?

He jugado un poco con los argumentos de la plantilla pero no he encontrado nada; Sería bueno no tener que llamar una función para los tipos enumerados y otra para todo lo demás.

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta