Die reine Header-C++17-Bibliothek bietet statische Reflexion für Aufzählungen und funktioniert mit jedem Aufzählungstyp ohne Makro- oder Boilerplate-Code.
Wenn Ihnen dieses Projekt gefällt, denken Sie bitte über eine Spende an einen der Fonds nach, die den Opfern des Krieges in der Ukraine helfen: https://u24.gov.ua.
Basic
# include < magic_enum/magic_enum.hpp >
# include < iostream >
enum class Color : { RED = - 10 , BLUE = 0 , GREEN = 10 };
int main () {
Color c1 = Color::RED;
std::cout << magic_enum::enum_name (c1) << std::endl; // RED
return 0 ;
}
Enum-Wert für String
Color color = Color::RED;
auto color_name = magic_enum::enum_name(color);
// color_name -> "RED"
String zum Aufzählen des Werts
std::string color_name{ " GREEN " };
auto color = magic_enum::enum_cast<Color>(color_name);
if (color.has_value()) {
// color.value() -> Color::GREEN
}
// case insensitive enum_cast
auto color = magic_enum::enum_cast<Color>(value, magic_enum::case_insensitive);
// enum_cast with BinaryPredicate
auto color = magic_enum::enum_cast<Color>(value, []( char lhs, char rhs) { return std::tolower (lhs) == std::tolower (rhs); }
// enum_cast with default
auto color_or_default = magic_enum::enum_cast<Color>(value).value_or(Color::NONE);
Ganzzahl zum Aufzählungswert
int color_integer = 2 ;
auto color = magic_enum::enum_cast<Color>(color_integer);
if (color.has_value()) {
// color.value() -> Color::BLUE
}
auto color_or_default = magic_enum::enum_cast<Color>(value).value_or(Color::NONE);
Indizierter Zugriff auf den Enum-Wert
std:: size_t i = 0 ;
Color color = magic_enum::enum_value<Color>(i);
// color -> Color::RED
Enum-Wertsequenz
constexpr auto colors = magic_enum::enum_values<Color>();
// colors -> {Color::RED, Color::BLUE, Color::GREEN}
// colors[0] -> Color::RED
Anzahl der Enum-Elemente
constexpr std:: size_t color_count = magic_enum::enum_count<Color>();
// color_count -> 3
Enum-Wert in Ganzzahl umwandeln
Color color = Color::RED;
auto color_integer = magic_enum::enum_integer(color); // or magic_enum::enum_underlying(color);
// color_integer -> 1
Enum-Namenssequenz
constexpr auto color_names = magic_enum::enum_names<Color>();
// color_names -> {"RED", "BLUE", "GREEN"}
// color_names[0] -> "RED"
Reihenfolge der Enum-Einträge
constexpr auto color_entries = magic_enum::enum_entries<Color>();
// color_entries -> {{Color::RED, "RED"}, {Color::BLUE, "BLUE"}, {Color::GREEN, "GREEN"}}
// color_entries[0].first -> Color::RED
// color_entries[0].second -> "RED"
Enum-Fusion für mehrstufige Switch/Case-Anweisungen
switch (magic_enum::enum_fuse(color, direction).value()) {
case magic_enum::enum_fuse (Color::RED, Directions::Up). value (): // ...
case magic_enum::enum_fuse (Color::BLUE, Directions::Down). value (): // ...
// ...
}
Enum-Switch-Laufzeitwert als constexpr-Konstante
Color color = Color::RED;
magic_enum::enum_switch ([] ( auto val) {
constexpr Color c_color = val;
// ...
}, color);
Enum iteriert für jedes Enum als constexpr-Konstante
magic_enum::enum_for_each<Color>([] ( auto val) {
constexpr Color c_color = val;
// ...
});
Überprüfen Sie, ob enum enthält
magic_enum::enum_contains (Color::GREEN); // -> true
magic_enum::enum_contains<Color>( 2 ); // -> true
magic_enum::enum_contains<Color>( 123 ); // -> false
magic_enum::enum_contains<Color>( " GREEN " ); // -> true
magic_enum::enum_contains<Color>( " fda " ); // -> false
Enum-Index der Reihe nach
constexpr auto color_index = magic_enum::enum_index(Color::BLUE);
// color_index.value() -> 1
// color_index.has_value() -> true
Funktionen für Flags
enum Directions : std:: uint64_t {
Left = 1 ,
Down = 2 ,
Up = 4 ,
Right = 8 ,
};
template <>
struct magic_enum ::customize::enum_range<Directions> {
static constexpr bool is_flags = true ;
};
magic_enum::enum_flags_name (Directions::Up | Directions::Right); // -> "Directions::Up|Directions::Right"
magic_enum::enum_flags_contains (Directions::Up | Directions::Right); // -> true
magic_enum::enum_flags_cast ( 3 ); // -> "Directions::Left|Directions::Down"
Name des Enum-Typs
Color color = Color::RED;
auto type_name = magic_enum::enum_type_name<decltype(color)>();
// type_name -> "Color"
IOstream-Operator für Enumeration
using magic_enum::iostream_operators:: operator <<; // out-of-the-box ostream operators for enums.
Color color = Color::BLUE;
std::cout << color << std::endl; // "BLUE"
using magic_enum::iostream_operators:: operator >>; // out-of-the-box istream operators for enums.
Color color;
std::cin >> color;
Bitweiser Operator für Enumeration
enum class Flags { A = 1 << 0 , B = 1 << 1 , C = 1 << 2 , D = 1 << 3 };
using namespace magic_enum ::bitwise_operators ; // out-of-the-box bitwise operators for enums.
// Support operators: ~, |, &, ^, |=, &=, ^=.
Flags flags = Flags::A | Flags::B & ~Flags::C;
Überprüft, ob der Typ eine Aufzählung ohne Gültigkeitsbereich ist.
enum color { red, green, blue };
enum class direction { left, right };
magic_enum::is_unscoped_enum<color>::value -> true
magic_enum::is_unscoped_enum<direction>::value -> false
magic_enum::is_unscoped_enum< int >::value -> false
// Helper variable template.
magic_enum::is_unscoped_enum_v<color> -> true
Überprüft, ob der Typ eine Scoped-Enumeration ist.
enum color { red, green, blue };
enum class direction { left, right };
magic_enum::is_scoped_enum<color>::value -> false
magic_enum::is_scoped_enum<direction>::value -> true
magic_enum::is_scoped_enum< int >::value -> false
// Helper variable template.
magic_enum::is_scoped_enum_v<direction> -> true
Statische Speicher-Enum-Variable in String. Diese Version verkürzt die Kompilierungszeiten erheblich und ist nicht auf die enum_range-Beschränkung beschränkt.
constexpr Color color = Color::BLUE;
constexpr auto color_name = magic_enum::enum_name<color>();
// color_name -> "BLUE"
containers::array
-Container für Aufzählungen.
magic_enum::containers::array<Color, RGB> color_rgb_array {};
color_rgb_array[Color::RED] = { 255 , 0 , 0 };
color_rgb_array[Color::GREEN] = { 0 , 255 , 0 };
color_rgb_array[Color::BLUE] = { 0 , 0 , 255 };
magic_enum::containers::get<Color::BLUE>(color_rgb_array) // -> RGB{0, 0, 255}
containers::bitset
Bitset-Container für Aufzählungen.
constexpr magic_enum::containers::bitset<Color> color_bitset_red_green {Color::RED|Color::GREEN};
bool all = color_bitset_red_green.all();
// all -> false
// Color::BLUE is missing
bool test = color_bitset_red_green.test(Color::RED);
// test -> true
containers::set
setzt Container für Aufzählungen.
auto color_set = magic_enum::containers::set<Color>();
bool empty = color_set.empty();
// empty -> true
color_set.insert(Color::GREEN);
color_set.insert(Color::BLUE);
color_set.insert(Color::RED);
std:: size_t size = color_set.size();
// size -> 3
Verbesserter UB-freier „SFINAE-freundlicher“ zugrunde liegender_Typ.
magic_enum::underlying_type<color>::type -> int
// Helper types.
magic_enum:: underlying_type_t <Direction> -> int
magic_enum
gibt nicht vor, eine Wunderwaffe für die Reflexion von Aufzählungen zu sein, es wurde ursprünglich für kleine Aufzählungen entwickelt.
Lesen Sie vor der Verwendung die Einschränkungen der Funktionalität.
Sie sollten die erforderliche Datei magic_enum.hpp und optional weitere Header aus dem Include-Verzeichnis oder dem Release-Archiv hinzufügen. Alternativ können Sie die Bibliothek mit CMake erstellen.
Wenn Sie vcpkg in Ihrem Projekt für externe Abhängigkeiten verwenden, können Sie das Paket magic-enum verwenden.
Wenn Sie Conan zum Verwalten Ihrer Abhängigkeiten verwenden, fügen Sie einfach magic_enum/xyz
zu Ihren Conan-Anforderungen hinzu, wobei xyz
die Release-Version ist, die Sie verwenden möchten.
Wenn Sie Build2 zum Erstellen und Verwalten Ihrer Abhängigkeiten verwenden, fügen Sie depends: magic_enum ^xyz
zur Manifestdatei hinzu, wobei xyz
die Release-Version ist, die Sie verwenden möchten. Anschließend können Sie das Ziel mit magic_enum%lib{magic_enum}
importieren.
Alternativ können Sie etwas wie CPM verwenden, das auf dem Fetch_Content
-Modul von CMake basiert.
CPMAddPackage(
NAME magic_enum
GITHUB_REPOSITORY Neargye/magic_enum
GIT_TAG x.y.z # Where `x.y.z` is the release version you want to use.
)
Bazel wird ebenfalls unterstützt. Fügen Sie einfach Folgendes zu Ihrer WORKSPACE-Datei hinzu:
http_archive(
name = "magic_enum",
strip_prefix = "magic_enum-<commit>",
urls = ["https://github.com/Neargye/magic_enum/archive/<commit>.zip"],
)
Um Bazel im Repository zu verwenden, ist Folgendes möglich:
bazel build //...
bazel test //...
bazel run //example
(Beachten Sie, dass Sie einen unterstützten Compiler verwenden oder ihn mit export CC= <compiler>
angeben müssen.)
Wenn Sie Ros verwenden, können Sie dieses Paket einbinden, indem Sie <depend>magic_enum</depend>
zu Ihrer package.xml hinzufügen und dieses Paket in Ihren Arbeitsbereich aufnehmen. Fügen Sie in Ihrer CMakeLists.txt Folgendes hinzu:
find_package (magic_enum CONFIG REQUIRED)
...
target_link_libraries (your_executable magic_enum::magic_enum)