[c++] enum和string相互转换

简介

原理还是很朴素的方法,只是用省略了重复代码,降低维护难度;

// enum to string
std::string enum2Str(Color c)
{
	switch(c){
		case RED: return "RED";
		case ORANGE: return "ORANGE";
		......
		default: return "Unknown"
	}
}
// string to enum
Color enumStr2Enum(const char* enumStr)
{
	if (0 == strcmp(enumStr, "RED")) return T::RED;
	......
	if (0 == strcmp(enumStr, "Unknown")) return T::Unknown;
}

满足的需求

  1. 更新枚举时不用修改转换相关的接口(enum2Str, str2Enum…);
  2. 在不同的库使用时只需包含头文件;
  3. enum能转换成字符串类型,字符串也能转成enum,当然字符串也能转换成enumValue;

code

只有头文件

// foo.h
#include<type_traits>
#ifndef COLOR_H
#define COLOR_H

#define DEF_ENUMS  \
    X(RED, 1)    \
    X(ORANGE, 2) \
    X(YELLOW, 3) \
    X(GREEN, 4)  \
    X(CYAN, 5)   \
    X(BLUE, 6)   \
    X(Unknown, UCHAR_MAX)

enum class Color : uint8_t {
#define X(name, value) name = value,
    DEF_ENUMS
#undef X
};

template <typename T>
concept enumType = std::is_enum<T>::value;

/// enum to string
template <enumType T>
std::string enum2Str(T e)
{
    switch (e) {
#define X(name, value) \
    case T::name:      \
        return #name;
        DEF_ENUMS
#undef X
    default:
        return "Unknown";
    }
}

/// string to enum
template <enumType T>
T enumStr2Enum(const char* enumStr)
{
#define X(name, value)               \
    if (0 == strcmp(enumStr, #name)) \
        return T::name;
    DEF_ENUMS
#undef X
        return T::Unknown;
}

template <typename enumType>
using enumValue_t = std::underlying_type_t<enumType>;
/** string to enum value
 * @brief if enumStr not exist, return "Unknown"
 */
template <enumType T>
enumValue_t<T> enumStr2Value(const char* enumStr)
{
#define X(name, value)               \
    if (0 == strcmp(enumStr, #name)) \
        return value;
    DEF_ENUMS
#undef X
        return static_cast<enumValue_t<T>>(T::Unknown);
}
#endif /* COLOR_H */

使用方法

#include <iostream>
#include "foo.h"
int main(){
	Color color{Color::GREEN};
    printf("enum2Str(color): %s\n", enum2Str(color).c_str());
    printf("enumStr2Value<Color>: %d\n", enumStr2Value<Color>("GREEN"));
    printf("enumStr2Enum<Color>: %d\n",enumStr2Enum<Color>("GREEN"));
	return 0;
}

输出

可优化点

头文件可能看着比较难懂,不知开放出来的接口是哪些;
感觉可以把宏的实现改到cpp里,但得注意多个文件使用时的坑
函数定义写在头文件中可能导致的多重定义错误(multiple definition)
C++模板类/函数,将头文件与源文件分离

参考链接

The X Macro - Digital Mars
X-Macros

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路途遥远gg

帮到你了就好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值