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 функции...

779   0  

Comments

    Ничего не найдено.