enum to string in modern C++11 / C++14 / C++17 and future C++2
Contraste a todas las demás preguntas similares, esta pregunta trata sobre el uso de las nuevas características de C ++. 2008c Existe una manera simple de convertir la enumeración de C ++ en una cadena? 2008c Manera fácil de usar variables de tipos de enumeración como cadena en C? 2008c ++ Cómo mapear fácilmente las enumeraciones de c ++ a cadenas 2008c ++ ¿Haciendo algo tanto un identificador C como una cadena? 2008c ++ Existe un script simple para convertir la enumeración de C ++ en una cadena? 2009c ++ ¿Cómo usar enumeraciones como banderas en C ++? 2011c ++ ¿Cómo convertir una variable de tipo enum a una cadena? 2011c ++ Enum a String C ++ 2011c ++ ¿Cómo convertir una variable de tipo enum a una cadena? 2012c Cómo convertir nombres de enumeración a cadenas en c 2013c Stringificar una enumeración compilada condicionalmente en CDespués de leer muchas respuestas, todavía no encontré ninguna: Manera elegante usando C ++ 11, C ++ 14 o C ++ 17 nuevas característica O algo listo para usar enAumentaElse algo planeado para C ++ 20Ejempl
o al menos ejecución rápida en tiempo de ejecución (por ejemplo,
Un ejemplo suele ser mejor que una larga explicación.
Puedes compilar y ejecutar este fragmento en Coliru.
( Otro ejemplo anterior también está disponible)
#include <map>
#include <iostream>
struct MyClass
{
enum class MyEnum : char {
AAA = -8,
BBB = '8',
CCC = AAA + BBB
};
};
// Replace magic() by some faster compile-time generated code
// (you're allowed to replace the return type with std::string
// if that's easier for you)
const char* magic (MyClass::MyEnum e)
{
const std::map<MyClass::MyEnum,const char*> MyEnumStrings {
{ MyClass::MyEnum::AAA, "MyClass::MyEnum::AAA" },
{ MyClass::MyEnum::BBB, "MyClass::MyEnum::BBB" },
{ MyClass::MyEnum::CCC, "MyClass::MyEnum::CCC" }
};
auto it = MyEnumStrings.find(e);
return it == MyEnumStrings.end() ? "Out of range" : it->second;
}
int main()
{
std::cout << magic(MyClass::MyEnum::AAA) <<'\n';
std::cout << magic(MyClass::MyEnum::BBB) <<'\n';
std::cout << magic(MyClass::MyEnum::CCC) <<'\n';
}
RestriccionesPor favor, no hay una duplicación invaluable deOtras respuesta obasic link. Por favor, evite la respuesta hinchada basada en macro, o intente reducir la#define
gastos generales lo mínimo posible. Por favor no manualenum
->string
mapeo.Agradable teneSupportenum
valores a partir de un número diferente de ceroSoporte negativoenum
valore Soporte fragmentadoenum
valoreSupportclass enum
(C ++ 11)Supportclass enum : <type>
teniendo alguna @ permiti<type>
(C ++ 11) Conversiones en tiempo de compilación (no en tiempo de ejecución) a una cadena,o al menos ejecución rápida en tiempo de ejecución (por ejemplo,
std::map
no es una gran idea ...)constexpr
(C ++ 11, relajado en C ++ 14)noexcept
(C ++ 11)snippet C ++ 14 / C ++ 17 amigable C ++Lo últimna posible idea podría ser utilizar las capacidades del compilador C ++ para generar código C ++ en el momento de la compilación utilizando trucos de metaprogramación basados envariadic template class
yconstexpr
funciones ...