Aufzählung in modernem C ++ 11 / C ++ 14 / C ++ 17 und zukünftigem C ++ 20

Im Gegensatz zu allen anderen ähnlichen Fragen, diese Frage ist über die Verwendung des neuen C++ - Funktionen.

Nach der Lektüre viele Antworten, habe ich noch nicht finden:

Beispiel

Ein Beispiel ist oft besser als eine lange Erklärung.

Kompilieren Sie und führen Sie dieses snippet auf Coliru.

(Ein weiteres ehemaliges Beispiel ist auch verfügbar)

#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';
}

Einschränkungen

  • Bitte keine wertvolle Vervielfältigung von andere Antworten oder Standard Verbindung.
  • Bitte vermeiden aufblasen makro-basiert Antwort, oder versuchen zu reduzieren, die #define Aufwand so minimal wie möglich.
  • Bitte keine manuellen enum -> string mapping.

Schön zu haben

  • Unterstützen enum die Werte ab einer Zahl von null Verschieden
  • Unterstützung negative enum Werte
  • Unterstützung fragmentiert enum Werte
  • Unterstützen class enum (C++11)
  • Unterstützen class enum : <type> dass alle zulässigen <type> (C++11)
  • Compile-Zeit (nicht Laufzeit) Umwandlungen in einen string

    oder zumindest eine schnelle Ausführung zur Laufzeit (z.B. std::map ist keine gute Idee...)
  • constexpr (C++11, entspannt in C++14)
  • noexcept (C++11)
  • snippet C++14/C++17 freundliche
  • C++ Stand der Technik

Eine mögliche Idee könnte mit der C++ - compiler Funktionen zum generieren von C++ code bei der Kompilierung-Zeit mit meta-Programmierung tricks basieren auf variadic template class und constexpr Funktionen...

InformationsquelleAutor der Frage olibre | 2015-03-03

Schreibe einen Kommentar