헤더 전용 C++17 라이브러리는 열거형에 대한 정적 반사를 제공하고 매크로나 상용구 코드 없이 모든 열거형 유형으로 작업할 수 있습니다.
이 프로젝트가 마음에 드신다면 우크라이나 전쟁 피해자를 돕는 기금 중 하나인 https://u24.gov.ua에 기부해 보시기 바랍니다.
기초적인
# 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 ;
}
열거형 값을 문자열로
Color color = Color::RED;
auto color_name = magic_enum::enum_name(color);
// color_name -> "RED"
열거형 값에 대한 문자열
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);
열거형 값에 대한 정수
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);
열거형 값에 대한 색인화된 액세스
std:: size_t i = 0 ;
Color color = magic_enum::enum_value<Color>(i);
// color -> Color::RED
열거형 값 순서
constexpr auto colors = magic_enum::enum_values<Color>();
// colors -> {Color::RED, Color::BLUE, Color::GREEN}
// colors[0] -> Color::RED
열거형 요소 수
constexpr std:: size_t color_count = magic_enum::enum_count<Color>();
// color_count -> 3
Enum 값을 정수로
Color color = Color::RED;
auto color_integer = magic_enum::enum_integer(color); // or magic_enum::enum_underlying(color);
// color_integer -> 1
열거형 이름 순서
constexpr auto color_names = magic_enum::enum_names<Color>();
// color_names -> {"RED", "BLUE", "GREEN"}
// color_names[0] -> "RED"
열거형 항목 순서
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"
다중 레벨 스위치/케이스 명령문을 위한 열거형 융합
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 (): // ...
// ...
}
constexpr 상수로서의 Enum 스위치 런타임 값
Color color = Color::RED;
magic_enum::enum_switch ([] ( auto val) {
constexpr Color c_color = val;
// ...
}, color);
열거형은 constexpr 상수로 각 열거형을 반복합니다.
magic_enum::enum_for_each<Color>([] ( auto val) {
constexpr Color c_color = val;
// ...
});
열거형에 포함되어 있는지 확인하세요.
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
순서대로 열거형 인덱스
constexpr auto color_index = magic_enum::enum_index(Color::BLUE);
// color_index.value() -> 1
// color_index.has_value() -> true
플래그 기능
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"
열거형 이름
Color color = Color::RED;
auto type_name = magic_enum::enum_type_name<decltype(color)>();
// type_name -> "Color"
열거형용 IOstream 연산자
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;
열거형의 비트 연산자
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;
유형이 범위가 지정되지 않은 열거형인지 확인합니다.
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
유형이 범위가 지정된 열거형인지 확인합니다.
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
문자열에 대한 정적 저장소 열거형 변수 이 버전은 컴파일 시간이 훨씬 가벼우며 enum_range 제한으로 제한되지 않습니다.
constexpr Color color = Color::BLUE;
constexpr auto color_name = magic_enum::enum_name<color>();
// color_name -> "BLUE"
containers::array
열거형에 대한 배열 컨테이너입니다.
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 컨테이너입니다.
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
.
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
UB가 필요 없는 "SFINAE 친화적" 기본_유형이 개선되었습니다.
magic_enum::underlying_type<color>::type -> int
// Helper types.
magic_enum:: underlying_type_t <Direction> -> int
magic_enum
열거형을 반영하기 위한 만능책인 척하지 않으며, 원래는 작은 열거형용으로 설계되었습니다.
사용하기 전에 기능의 제한 사항을 읽어 보십시오.
필요한 파일 Magic_enum.hpp를 추가하고 선택적으로 include dir 또는 release archive의 다른 헤더를 추가해야 합니다. 또는 CMake를 사용하여 라이브러리를 빌드할 수 있습니다.
외부 종속성을 위해 프로젝트에서 vcpkg를 사용하는 경우 Magic-enum 패키지를 사용할 수 있습니다.
Conan을 사용하여 종속성을 관리하는 경우 conan의 요구 사항에 magic_enum/xyz
추가하기만 하면 됩니다. 여기서 xyz
사용하려는 릴리스 버전입니다.
Build2를 사용하여 종속성을 빌드하고 관리하는 경우 매니페스트 파일에 depends: magic_enum ^xyz
추가합니다. 여기서 xyz
사용하려는 릴리스 버전입니다. 그런 다음 magic_enum%lib{magic_enum}
사용하여 대상을 가져올 수 있습니다.
또는 CMake의 Fetch_Content
모듈을 기반으로 하는 CPM과 같은 것을 사용할 수 있습니다.
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도 지원됩니다. WORKSPACE 파일에 추가하기만 하면 됩니다.
http_archive(
name = "magic_enum",
strip_prefix = "magic_enum-<commit>",
urls = ["https://github.com/Neargye/magic_enum/archive/<commit>.zip"],
)
저장소 내에서 bazel을 사용하려면 다음을 수행할 수 있습니다.
bazel build //...
bazel test //...
bazel run //example
(지원되는 컴파일러를 사용하거나 export CC= <compiler>
로 지정해야 합니다.)
Ros를 사용하는 경우 package.xml에 <depend>magic_enum</depend>
추가하여 이 패키지를 작업 공간에 포함시킬 수 있습니다. CMakeLists.txt에 다음을 추가하세요.
find_package (magic_enum CONFIG REQUIRED)
...
target_link_libraries (your_executable magic_enum::magic_enum)