C++枚举与字符串转换工具类

C++枚举与字符串转换工具类


最近需要一个能够在字符串和枚举值之间互相转换的功能,因为C++没有对枚举值进行遍历、反射之类的操作,不像Java那样可以轻松搞定。网上找到一些代码感觉用起来有点不爽,于是研究一番后,写了一个工具类。

如果要转换的字符串和枚举名完全一样,请直接使用超赞的 magic_enum

闲话不多说,直接上代码:

template <typename T>
    class EnumHelper {
    private:
        std::map<T, std::string> _mapEnum2String;
        std::map<std::string, T> _mapString2Enum;
        T _defaultValue;

    private:
        static std::map<std::string, T> genString2EnumMap(std::map<T, std::string> enum2StringMap)
        {
            std::map<std::string, T> result;
            for (const auto& item : enum2StringMap) {
                result.emplace(std::make_pair(item.second, item.first));
            }
            return result;
        };

    public:
        // constructor with initial enum-string map and a default enum value
        EnumHelper(const std::map<T, std::string>&& origin, const T defaultValue)
        {
            _mapEnum2String = std::move(origin);
            _mapString2Enum = genString2EnumMap(_mapEnum2String);
            _defaultValue = defaultValue;
        }

        T toEnum(const std::string& str)
        {
            if (str.empty()) {
                return _defaultValue;
            }

            auto find = _mapString2Enum.find(str);
            if (find == _mapString2Enum.end()) {
                LOG(ERROR) << "Unrecognized string \"" << str << "\" for enum: " << typeid(T).name();
                return _defaultValue;
            } else {
                return find->second;
            }
        }

        // get enum from string, if not matched, return specified value
        T toEnum(const std::string& str, const T defaultValue)
        {
            auto find = _mapString2Enum.find(str);
            if (find == _mapString2Enum.end()) {
                LOG(ERROR) << "Unrecognized string \"" << str << "\" for enum: " << typeid(T).name();
                return defaultValue;
            } else {
                return find->second;
            }
        }

        std::string toString(const T& enumValue)
        {
            return _mapEnum2String.at(enumValue);
        }
    };

逻辑很简单,就是基于模板创建两个字符串和枚举值映射关系的map,然后就可以用内置的函数实现转换了。构造函数的参数有两个,一个是字符串与枚举的映射数组,另一个是无法识别字符串时的缺省枚举值。下面是针对一个枚举的定义实例:

static EnumHelper<DataStatus> DataStatusHelper(
        { {DataStatus_Created, "created"},
          {DataStatus_Active, "active"},
          {DataStatus_Inactive, "inactive"},
          {DataStatus_Deleted, "deleted"} },
        DataStatus_Deleted);

上面的代码申明了一个DataStatusHelper的转换类实例(注意,是对象实例,不是类),所以,你应该在合适的地方把它申明成全局变量,然后在需要进行转换的地方,用下面的方法调用:

// 字符串转枚举
auto status = DataStatusHelper.toEnum("created");
// 枚举转字符串
std::string str = DataStatusHelper.toString(DataStatus::DataStatus_Created);

这是目前为止我所知道的使用者最节省代码的写法了,觉得好,点个赞哦!

在C语言中,可以使用枚举(enum)来定义一组具有相同类型的常量。枚举变量可以通过定义一个枚举类型并声明一个变量来创建。例如,引用中提到的C++代码中的枚举字符串转换工具类,在C语言中可以通过定义一个枚举类型,然后使用该枚举类型来声明变量实现相同的功能。 在C语言中,类的概念并不存在。C语言是一种过程式编程语言,没有类和对象的概念。引用中提到的类对象的存储方式和引用中的类的定义和对象实例化都是C++的语法。 所以,在C语言中,无法直接使用类和对象的概念,也无法进行类对象的存储方式和大小的计算。如果需要实现类似的功能,可以使用结构体来定义一个数据类型,然后通过结构体变量来表示对象。但是,结构体无法封装成员函数,只能通过函数来操作结构体变量。 总结起来,在C语言中,没有类和对象的概念,只能使用枚举和结构体来达到类似的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++枚举字符串转换工具类](https://blog.csdn.net/zazzh007/article/details/114408928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [< C++ >:C++ 类和对象(上)](https://blog.csdn.net/lcc11223/article/details/125204055)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【C++】类和对象](https://blog.csdn.net/iluo12/article/details/124380824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值