Magic Enum : la revolution des enumérations en C++
15176 단어 libraryprogrammingcpp
C'est une "헤더 전용 C++17 라이브러리"qui permet de faire la reflexion statique sur des
enums
.Un bon exemple vaut mieux qu'un long discours :
#include <iostream>
#include "magic_enum.hpp"
enum class MyEnum {
HELLO = 42, WORLD = 99
};
int main() {
constexpr auto enumName = magic_enum::enum_type_name<MyEnum>();
constexpr auto scoped = magic_enum::is_scoped_enum<MyEnum>::value;
std::cout << enumName << " is scoped = " << std::boolalpha << scoped << '\n';
constexpr auto count = magic_enum::enum_count<MyEnum>();
std::cout << "It has " << count << " possible values :" << '\n';
for (auto name : magic_enum::enum_names<MyEnum>()) {
std::cout << "- " << name << '\n';
}
std::cout << '\n';
for (unsigned int i = 0; i < count; ++i) {
auto value = magic_enum::enum_value<MyEnum>(i);
using namespace magic_enum::ostream_operators; // to pretty print the enum value
std::cout << "Value = " << value << '\n';
std::cout << "Integer = " << magic_enum::enum_integer(value) << '\n';
std::cout << "Offset = " << magic_enum::enum_index(value).value() << '\n';
auto name = magic_enum::enum_name(value);
std::cout << "Name = " << name << '\n';
std::cout << "---------" << '\n';
}
std::cout << '\n';
std::cout << "Cast to enum:" << '\n';
using namespace magic_enum::ostream_operators; // to print std::optional<MyEnum>
constexpr auto invalid = magic_enum::enum_cast<MyEnum>(0);
constexpr auto HELLO = magic_enum::enum_cast<MyEnum>("HELLO");
constexpr auto hello = magic_enum::enum_cast<MyEnum>("hello");
constexpr auto WORLD = magic_enum::enum_cast<MyEnum>("WORLD");
constexpr auto WORLD_AGAIN = magic_enum::enum_cast<MyEnum>(99);
std::cout << invalid << '\n';
std::cout << HELLO << '\n';
std::cout << hello << '\n';
std::cout << WORLD << '\n';
}
출격 :
MyEnum is scoped = true
It has 2 possible values :
- HELLO
- WORLD
Value = HELLO
Integer = 42
Offset = 0
Name = HELLO
---------
Value = WORLD
Integer = 99
Offset = 1
Name = WORLD
---------
Cast to enum:
HELLO
WORLD
WORLD
자이 에세이 드 메트르 autant que
constexpr
푸어 vous montrer qu'une bonne partie est faisable à la compilation, ce qui veut dire un coût nul à l'execution. Comme j'ai une boucle, je ne peux pas mettre des constexpr
partout mais si je choisis de prendre une valeur particulière de l'énumération, c'est possible :int main() {
using namespace magic_enum::ostream_operators;
constexpr auto value = magic_enum::enum_cast<MyEnum>("HELLO").value();
constexpr auto integer = magic_enum::enum_integer(value);
constexpr auto index = magic_enum::enum_index(value).value();
constexpr auto name = magic_enum::enum_name(value);
std::cout << "Value = " << value << '\n';
std::cout << "Integer = " << integer << '\n';
std::cout << "Offset = " << index << '\n';
std::cout << "Name = " << name << '\n';
}
출격 :
Value = HELLO
Integer = 42
Offset = 0
Name = HELLO
Un monde de trucs Cools s'ouvre à nous :
COUNT
à l'énumération : à la place, il suffit d'utiliser enum_count()
. enum_name()
ou l'opérateur de stream fourni. enum_cast()
. enum_cast()
. enum_index()
. Si votre compilateur est compatible C++17, téléchargez, utilisez, appréciez. Sinon... il est temps de faire du lobbying pour mettre à jour votre compilateur 😅
Reference
이 문제에 관하여(Magic Enum : la revolution des enumérations en C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/younup/magic-enum-la-revolution-des-enumerations-en-c-2ec2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)