我有一个标记列表,我想从它创建一个enum (琐碎的)和一个字符串数组(稍后用于创建字符串到enum的映射)。以下是我的尝试:
#define TOKEN_LIST CUBE , SPHERE , CIRCLE
#define CREATE_ARRAY_OF_STRINGS( ... ) const char* token[] = { __VA_ARGS__ };
CREATE_ARRAY_OF_STRINGS( TOKEN_LIST )
// enum SHAPE_TYPE{ TOKEN_LIST }; // easy
int main(int argc, char *argv[])
{
return 1;
}
问题是,当我使用TOKEN_LIST
标志编译时,没有像下面所示的那样对-E
进行字符串化:
const char* token[] = { CUBE , SPHERE , CIRCLE };
int main(int argc, char *argv[])
{
return 1;
}
const char* token[] = { CUBE , SPHERE , CIRCLE };
应该是const char* token[] = { "CUBE" , "SPHERE" , "CIRCLE" };
的地方
还有其他方法可以用C++03来实现这一点吗?也许是升压处理器?
发布于 2016-01-15 07:45:00
如果您愿意稍微更改一下TOKEN_LIST
的格式,那么您可以很容易地使用Boost.Preprocessor完成这一任务。
下面是一个使用Boost.Preprocessor序列而不是逗号分隔的列表的示例:
#define GENERATE_STRING(maZ, maIdx, maTokens) \
BOOST_PP_STRINGIZE(BOOST_PP_SEQ_ELEM(maIdx, maTokens))
#define GENERATE_STRINGS(maTokens) \
BOOST_PP_ENUM(BOOST_PP_SEQ_SIZE(maTokens), GENERATE_STRING, maTokens)
#define TOKEN_LIST (CUBE)(SPHERE)(CIRCLE)
const char* token[] = { GENERATE_STRINGS(TOKEN_LIST) }
enum ShapeType {
BOOST_PP_SEQ_ENUM(TOKEN_LIST)
};
由于您似乎可以访问...
和__VA_ARGS__
(这不是C++03特性),您也应该能够使用Boost.Preprocessor元组(括号中包含逗号分隔的列表);由于支持各种宏,Boost.Preprocessor能够隐式地确定元组大小。但是,我没有这方面的经验,所以我不能提供代码示例。
maZ
参数是Boost.Preprocessor重复宏的实现特性。有三种:z(由枚举样式函数使用)、d(由时间样式函数使用)和r(由for-样式函数使用)。它只在嵌套这些结构时才有用,因为它允许更快的预处理。如果GENERATE_STRING
本身正在调用枚举函数,那么在预处理器上使用BOOST_PP_ENUM_ ## maZ
将比仅使用BOOST_PP_ENUM
进行嵌套调用更容易(但后者也能工作,只要您不超过编译器的预处理限制)。
https://stackoverflow.com/questions/34814276
复制