从符号中删除空格

时间:2015-04-18 07:31:11

标签: c++ boost boost-preprocessor

我正在使用Boost预处理器序列生成enum s,所以例如我有一个像

这样的定义
#define DESERTS (Cheesecake)(Apple Pie)(Merengue)

现在我要做的是生成两个一个合理的enum class以及流输出操作。后者是好的,但前者并不是因为我不知道如何改变,而是将(Apple Pie)称为没有空格的枚举成员,即ApplePie。这可能与Boost预处理器魔法有关吗?

1 个答案:

答案 0 :(得分:2)

不完全是这个输入,但有解决方法。我能想到的最明智的是改变输入数据,以便可以单独处理多字标识符的单词:

#define DESSERTS ((Cheesecake))((Apple)(Pie))((Merengue))

由于标识符部分现在作为序列的一部分,您可以用BOOST_PP_SEQ_FOLD_LEFT生成枚举类和相关名称:

#define DUMP_NORMAL(d, state, x) state x
#define DUMP_CONCAT(d, state, x) BOOST_PP_CAT(state, x)

#define MAKE_STRING(r, data, seq) BOOST_PP_STRINGIZE(BOOST_PP_SEQ_FOLD_LEFT(DUMP_NORMAL, , seq)),
#define MAKE_IDENTIFIER(r, data, seq) BOOST_PP_SEQ_FOLD_LEFT(DUMP_CONCAT, , seq),

enum class Desserts {
  BOOST_PP_SEQ_FOR_EACH(MAKE_IDENTIFIER, _, DESSERTS)
};

char const *const DessertNames[] = {
  BOOST_PP_SEQ_FOR_EACH(MAKE_STRING, _, DESSERTS)
};