В отличие от всех других подобных вопросов, этот вопрос касается использования новых функций C++.
- 2008 c Есть ли простой способ преобразовать перечисление C++ в строку?
- 2008 c Простой способ использовать переменные типов enum в виде строки в C?
- 2008 c++ Как легко отобразить перечисления C++ в строки
- 2008 c++ Создание чего-то и идентификатора C, и строки?
- 2008 c++ Существует ли простой скрипт для преобразования перечисления C++ в строку?
- 2009 c++ Как использовать перечисления в качестве флагов в C++?
- 2011 c++ Как преобразовать переменную типа enum в строку?
- 2011 c++ Enum to String C++
- 2011 c++ Как преобразовать переменную типа enum в строку?
- 2012 c Как преобразовать имена перечислений в строковые в c
- 2013 c Стрификация условно скомпилированного перечисления в C
Прочитав много ответов, я так и не нашел:
- Элегантный способ использования C++ 11, C++ 14 или C++ 17 новых функций
- Или что-то готовое к использованию в Boost
- Еще что-то запланировано на C++ 20
Пример
Пример часто лучше длинного объяснения.
Вы можете скомпилировать и запустить этот фрагмент на Coliru.
(Another former example is also available)
#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 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';
}
Ограничения
- Пожалуйста, не допускайте бесполезного дублирования других ответов или базовой ссылки.
- Пожалуйста, избегайте раздутых ответов на основе макросов или постарайтесь как можно меньше сократить накладные расходы
#define
. - Пожалуйста, не используйте ручное отображение
enum
→string
.
Приятно иметь
- Поддержка значений
enum
, начинающихся с номера, отличного от нуля - Поддержка отрицательных значений
enum
- Поддержка фрагментированных значений
enum
- Поддержка
class enum
(C++ 11) - Поддержка
class enum : <type>
с любым разрешенным<type>
(C++ 11) - Преобразования во время компиляции (не во время выполнения) в строку,
или, по крайней мере, быстрое выполнение во время выполнения (например,std::map
не очень хорошая идея...) constexpr
(C++ 11, затем расслаблено в C++ 14/17/20)noexcept
(C++ 11)- C++ 17/C++ 20 дружеский фрагмент
Одной из возможных идей может быть использование возможностей компилятора C++ для генерации кода C++ во время компиляции с использованием трюков метапрограммирования, основанных на функциях variadic template class
и constexpr
...