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

Posted 沙漠豪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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++枚举与字符串转换工具类的主要内容,如果未能解决你的问题,请参考以下文章

特殊工具与技术C++

特殊工具与技术C++

特殊工具与技术C++

C#如何将枚举类(enum)型转换成字符(string)类型

C++里怎样用map将枚举类转换到string类

c++字符串转换为枚举类型