tengo la siguiente función que convierte una cadena en un tipo de datos numéricos:¿Cómo puedo extender un molde léxico para admitir tipos enumerados?
template <typename T>
bool ConvertString(const std::string& theString, T& theResult)
{
std::istringstream iss(theString);
return !(iss >> theResult).fail();
}
Esto no funciona para los tipos enumerados, sin embargo, por lo 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;
}
(Estoy asumiendo que theString tiene un valor válido para el tipo enumerado; lo estoy usando principalmente para la serialización simple)
¿Hay alguna 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 agradable no tener que llamar a una función para tipos enumerados y otra para todo lo demás.
Gracias
+1. También estaba a punto de escribir un comentario sobre por qué esto no estaba en la biblioteca estándar, hasta que leí la respuesta de GMan a continuación. – Jon
boost ya no es necesario ya que std :: enable_if y std :: is_enum proporcionan estas funcionalidades en C++ 11 – moala