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

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 últim

na 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 ...

Respuestas a la pregunta(26)

Su respuesta a la pregunta