当前位置: 首页 > 知识库问答 >
问题:

现代C++11/C++14/C++17和未来C++20中的字符串枚举

乔宏峻
2023-03-14
    null
    null
#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) <<'\n';
   std::cout << magic(MyClass::MyEnum::BBB) <<'\n';
   std::cout << magic(MyClass::MyEnum::CCC) <<'\n';
}
    null
  • 支持枚举值从不同于零的数字开始
  • 支持负枚举
  • 支持分段的枚举
  • 支持类枚举(C++11)
  • 支持类枚举: 具有任何允许的 (C++11)
  • 编译时(而不是运行时)转换为字符串
    或至少在运行时快速执行(例如std::map不是个好主意……)
  • constexpr(C++11,然后在C++14/17/20中放松)
  • 除了(C++11)
  • C++17/C++20友好代码段

一个可能的想法是使用C++编译器的功能,在编译时使用基于variadic模板类constexpr函数的元编程技巧生成C++代码...

共有1个答案

阎德宇
2023-03-14
#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
};

有关更多示例,请查看home repository 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]中。

#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风格的字符串,string 字符串的输入输出,访问字符串中的字符,字符串的拼接,string 字符串的增删改查C++ 大大增强了对字符串的支持,除了可以使用C风格的字符串,还可以使用内置的 string 类。string 类处理起字符串来会方便很多,完全可以代替C语言中的字符数组或字符串 指针。 string 是 C++ 中常用的一个类,它非常重要,我们有必要在此单独讲解一下。 使用 string 类需要包含头文件 ,下面的例子介绍了几种定义 string 变量(对象)的方法:

  • 主要内容:1、声明和初始化字符串,2、String 类中的属性,3、String 类中的方法在 C# 中,string(或 String)关键字是 System.String 类的别名,其中提供了定义字符串以及操作字符串的一系列方法,下面就来详细介绍一下。 1、声明和初始化字符串 您可以使用以下方式来创建字符串 为 String 类型的变量赋值一个字符串; 使用 String 类的构造函数; 使用字符串串联运算符; 通过检索属性或调用返回字符串的方法; 通过调用格式化方法将值或对象转换为

  • C++ 提供了以下两种类型的字符串表示形式: C 风格字符串 C++ 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 "Hello" 字符串。由于在数组的末尾存储了空字符,所以字

  • 本文向大家介绍C/C++字符串与数字互转的实现,包括了C/C++字符串与数字互转的实现的使用技巧和注意事项,需要的朋友参考一下 C数字转字符串 C字符串转数字 C++字符串转数字 C++11增加std::stoi/stol/stoll等等函数可以 转换 C++数字转字符串 C++11增加了全局函数std::to_string,以及std::stoi/stol/stoll等等函数 string和ch

  • 我想找到最快的方法来检查标准C 11、14、17或C中是否存在文件。我有数千个文件,在对它们执行操作之前,我需要检查它们是否都存在。在下面的函数中,我可以写什么来代替*/?

  • 本文向大家介绍C和C++11之enum枚举的具体使用方法,包括了C和C++11之enum枚举的具体使用方法的使用技巧和注意事项,需要的朋友参考一下 一、前言 由于C++项目中用了相对比较多的枚举(enum),正常情况下,枚举变量都是占用一个整形类型的大小,但是项目中枚举(enum)只需要使用到一个字节的大小,因为是在嵌入式设备上执行的代码,资源比较少,那么如果枚举都是按照int型大小来使用的话,这