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