問題描述
與所有其他類似問題相反,這個問題是關于使用新的 C++ 特性.
- 2008 c 有沒有一種簡單的方法可以將 C++ 枚舉轉換為字符串?
- 2008 c 在 C 中使用枚舉類型的變量作為字符串的簡單方法?
- 2008 c++ 如何輕松地將 C++ 枚舉映射到字符串
- 2008 c++ 使某些東西既是 C 標識符又是字符串?
- 2008 c++ 是否有將 C++ 枚舉轉換為字符串的簡單腳本?
- 2009 c++ 如何在 C++ 中使用枚舉作為標志?
- 2011 c++ 如何將枚舉類型變量轉換為字符串?
- 2011 c++ 枚舉到字符串 C++
- 2011 c++ 如何將枚舉類型變量轉換為字符串?
- 2012 c 如何在 c 中將枚舉名稱轉換為字符串
- 2013 c 在 C 中對條件編譯的枚舉進行字符串化
看了很多答案,我還沒有找到:
- 使用 C++11 的優雅方式,C++14 或 C++17 新功能
- 或者在 Boost 中準備使用的東西
- 其他為 C++20 的計劃
示例
一個例子往往比一個長的解釋要好.
您可以在 Coliru 上編譯并運行此代碼段.
(另一個前面的例子也是可用的)
#include
限制條件
- 請不要重復其他答案或基本鏈接.莉>
- 請避免基于宏的臃腫答案,或盡量減少
#define
開銷. - 請不要手動
enum
->string
映射.
很高興有
- 支持
enum
值從非零的數字開始 - 支持負
enum
值 - 支持碎片化的
enum
值 - 支持
類枚舉
(C++11) - 支持
class enum :
具有任何允許的
(C++11) - 編譯時(非運行時)轉換為字符串,
或者至少在運行時快速執行(例如std::map
不是一個好主意......) constexpr
(C++11,然后在 C++14/17/20 中放松)noexcept
(C++11)- C++17/C++20 友好代碼段
一個可能的想法是使用 C++ 編譯器功能在編譯時使用基于 variadic template class
和 constexpr
函數的元編程技巧生成 C++ 代碼..
Magic Enum 僅標頭庫為 C++17 的枚舉(到字符串、從字符串、迭代)提供靜態反射.
#include 枚舉顏色 { 紅色 = 2, 藍色 = 4, 綠色 = 8 };顏色顏色 = 顏色::紅色;auto color_name = magic_enum::enum_name(color);//顏色名稱 ->紅色的"std::string color_name{"GREEN"};自動顏色 = magic_enum::enum_cast(color_name)如果(顏色.has_value()){//color.value() ->顏色::綠色};
有關更多示例,請查看主存儲庫 https://github.com/Neargye/magic_enum.>
缺點在哪里?
此庫使用特定于編譯器的 hack(基于 __PRETTY_FUNCTION__
/__FUNCSIG__
),適用于 Clang >= 5、MSVC >= 15.3 和 GCC >= 9.
枚舉值必須在 [MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]
范圍內.
默認
MAGIC_ENUM_RANGE_MIN = -128
,MAGIC_ENUM_RANGE_MAX = 128
.如果所有枚舉類型默認需要另一個范圍,重新定義宏
MAGIC_ENUM_RANGE_MIN
和MAGIC_ENUM_RANGE_MAX
.MAGIC_ENUM_RANGE_MIN
必須小于或等于0
,并且必須大于INT16_MIN
.MAGIC_ENUM_RANGE_MAX
必須大于0
且必須小于INT16_MAX
.如果需要特定枚舉類型的另一個范圍,請為必要的枚舉類型添加特殊化 enum_range.
#include
枚舉數 { 一 = 100, 二 = 200, 三 = 300 };命名空間magic_enum {模板 <>struct enum_range {靜態 constexpr int min = 100;靜態 constexpr int 最大值 = 300;};}
Contrary to all other similar questions, this question is about using the new C++ features.
- 2008 c Is there a simple way to convert C++ enum to string?
- 2008 c Easy way to use variables of enum types as string in C?
- 2008 c++ How to easily map c++ enums to strings
- 2008 c++ Making something both a C identifier and a string?
- 2008 c++ Is there a simple script to convert C++ enum to string?
- 2009 c++ How to use enums as flags in C++?
- 2011 c++ How to convert an enum type variable to a string?
- 2011 c++ Enum to String C++
- 2011 c++ How to convert an enum type variable to a string?
- 2012 c How to convert enum names to string in c
- 2013 c Stringifying an conditionally compiled enum in C
After reading many answers, I did not yet find any:
- Elegant way using C++11, C++14 or C++17 new features
- Or something ready-to-use in Boost
- Else something planned for C++20
Example
An example is often better than a long explanation.
You can compile and run this snippet on Coliru.
(Another former example is also available)
#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) <<'
';
std::cout << magic(MyClass::MyEnum::BBB) <<'
';
std::cout << magic(MyClass::MyEnum::CCC) <<'
';
}
Constraints
- Please no valueless duplication of other answers or basic link.
- Please avoid bloat macro-based answer, or try to reduce the
#define
overhead as minimum as possible. - Please no manual
enum
->string
mapping.
Nice to have
- Support
enum
values starting from a number different from zero - Support negative
enum
values - Support fragmented
enum
values - Support
class enum
(C++11) - Support
class enum : <type>
having any allowed<type>
(C++11) - Compile-time (not run-time) conversions to a string,
or at least fast execution at run-time (e.g.std::map
is not a great idea...) constexpr
(C++11, then relaxed in C++14/17/20)noexcept
(C++11)- C++17/C++20 friendly snippet
One possible idea could be using the C++ compiler capabilities to generate C++ code at compilation-time using meta-programming tricks based on variadic template class
and constexpr
functions...
Magic Enum header-only library provides static reflection for enums (to string, from string, iteration) for C++17.
#include <magic_enum.hpp>
enum Color { RED = 2, BLUE = 4, GREEN = 8 };
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
};
For more examples check home repository https://github.com/Neargye/magic_enum.
Where is the drawback?
This library uses a compiler-specific hack (based on __PRETTY_FUNCTION__
/ __FUNCSIG__
), which works on Clang >= 5, MSVC >= 15.3 and GCC >= 9.
Enum value must be in range [MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]
.
By default
MAGIC_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
.MAGIC_ENUM_RANGE_MIN
must be less or equals than0
and must be greater thanINT16_MIN
.MAGIC_ENUM_RANGE_MAX
must be greater than0
and must be less thanINT16_MAX
.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; }; }
這篇關于在現代 C++11/C++14/C++17 和未來的 C++20 中枚舉到字符串的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!