2.6 KiB
Nameof
- If argument does not have name, occurs the compilation error
"Expression does not have a name."
.
Nameof Type
-
To check is nameof_type supported compiler use macro
NAMEOF_TYPE_SUPPORTED
or constexpr constantnameof::is_nameof_type_supported
. -
This library uses a compiler-specific hack (based on
__PRETTY_FUNCTION__
/__FUNCSIG__
), which works on Clang >= 5, MSVC >= 15.3 and GCC >= 7. -
Nameof type returns compiler-specific type name.
-
If argument does not have name, occurs the compilation error
"Expression does not have a name."
.
Nameof Enum
-
To check is nameof_enum supported compiler use macro
NAMEOF_ENUM_SUPPORTED
or constexpr constantnameof::is_nameof_enum_supported
. -
This library uses a compiler-specific hack (based on
__PRETTY_FUNCTION__
/__FUNCSIG__
), which works on Clang >= 5, MSVC >= 15.3 and GCC >= 9. -
Enum can't reflect if the enum is a forward declaration.
-
Enum value must be in range
[MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]
. By defaultMAGIC_ENUM_RANGE_MIN = -128
,MAGIC_ENUM_RANGE_MAX = 128
. -
If need another range for all enum types by default, redefine the macro
MAGIC_ENUM_RANGE_MIN
andMAGIC_ENUM_RANGE_MAX
.#define MAGIC_ENUM_RANGE_MIN 0 #define MAGIC_ENUM_RANGE_MAX 256 #include <magic_enum.hpp>
-
If need another range for specific enum type, add specialization
enum_range
for necessary enum type.#include <magic_enum.hpp> enum number { one = 100, two = 200, three = 300 }; namespace magic_enum { template <> struct enum_range<number> { static constexpr int min = 100; static constexpr int max = 300; }; }
-
magic_enum
obtains the first defined value enums, and won't work if value are aliased.enum ShapeKind { ConvexBegin = 0, Box = 0, // Won't work. Sphere = 1, ConvexEnd = 2, Donut = 2, // Won't work too. Banana = 3, COUNT = 4, }; // magic_enum::enum_cast<ShapeKind>("Box") -> std::nullopt // magic_enum::enum_name(ShapeKind::Box) -> "ConvexBegin"
Work around the issue:
enum ShapeKind { // Convex shapes, see ConvexBegin and ConvexEnd below. Box = 0, Sphere = 1, // Non-convex shapes. Donut = 2, Banana = 3, COUNT = Banana + 1, // Non-reflected aliases. ConvexBegin = Box, ConvexEnd = Sphere + 1, }; // magic_enum::enum_cast<ShapeKind>("Box") -> ShapeKind::Box // magic_enum::enum_name(ShapeKind::Box) -> "Box" // Non-reflected aliases. // magic_enum::enum_cast<ShapeKind>("ConvexBegin") -> std::nullopt // magic_enum::enum_name(ShapeKind::ConvexBegin) -> "Box"