我正在尝试实现一个正确的枚举到字符串宏,它将自动实现枚举值和代码中的名称之间的关联。
例如,我想定义一个名为“test”的新宏,如下所示:
ENUM_STR_DECLARE(Test, 1, test1, test2, test3)
这样,通过调用TestEnumToString(test2)
,我可以访问字符串“test2”
。目前,这个enum_str_declare
的当前实现如下所示:
#define ENUM_STR_DECLARE(enumName, intOffset, v1, ...)\
enum enumName { v1 = intOffset, __VA_ARGS__};\
const char *enumName##EnumStringArray[] = { #v1 ,#__VA_ARGS__};\
const char *enumName##EnumToString(value) { return enumName##EnumStringArray[ value - offset ]; }
虽然当我这样做时,__va_args__
处理的枚举没有得到正确的名称分隔:
enum Test {
test1 = 1, test2, test3
};
const char *TestEnumStringArray[] = {"test1", "test2, test3"};
const char *TestEnumToString(value) { return TestEnumStringArray[ value - offset]; }
因为我希望使用“test2”,“test3”
而不是“test2,test3”
。
有没有办法用逗号分隔来展开#__va_args__
名称?
干杯!
使用boost预处理器:
#include <boost/preprocessor/tuple.hpp>
#include <boost/preprocessor/seq.hpp>
#include <boost/preprocessor/stringize.hpp>
#define MACRO_DELIM(r, data, elem) BOOST_PP_STRINGIZE(elem) ,
#define DELIMITED_STRINGIZE(...) \
BOOST_PP_SEQ_FOR_EACH(MACRO_DELIM, _, \
BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)))
#define ENUM_STR_DECLARE(enumName, intOffset, v1, ...)\
enum enumName { v1 = intOffset, __VA_ARGS__};\
const char *enumName##EnumStringArray[] = { DELIMITED_STRINGIZE(v1, __VA_ARGS__)};\
const char *enumName##EnumToString(value) { return enumName##EnumStringArray[ value - offset ]; }
ENUM_STR_DECLARE(Test, 1, test1, test2, test3)
演示:
http://coliru.stacked-crooked.com/A/3F3376F2D4ABE266