我正在重构一些现有的样板代码,并意识到 Boost:::Preprocessor 可以简化事情,但我已经遇到了麻烦......这是一个简单的例子:
#define CLASSES ( 4, ( A, B, C, D ) )
#define FOWARD_CLASS( Z, N, _ ) class BOOST_PP_ARRAY_ELEM( N, CLASSES );
BOOST_PP_REPEAT( 4, FOWARD_CLASS, _ );
我希望这将扩展到:
class A;class B;class C; class D;
但我实际上得到:
error: expected identifier before ‘(’ token
error: expected `)' before ‘(’ token
重复四次。由于无法“看到”预处理器输出,我真的很难知道我哪里出错了——任何更有经验的人可以提供解决方案吗?
更新
切换到使用序列使其工作:
#define CLASSES (A)(B)(C)(D)
#define FOWARD_CLASS( R, _ , ELEM ) class ELEM;
BOOST_PP_SEQ_FOR_EACH( FOWARD_CLASS, _, CLASSES )
但是,我看不出最后一个示例不起作用的原因!
重复预处理器输出
这是原始代码的输出(带有BOOST_PP_REPEAT
):
class BOOST_PP_ARRAY_ELEM( 0, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 1, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 2, ( 4, ( A, B, C, D ) ) );
class BOOST_PP_ARRAY_ELEM( 3, ( 4, ( A, B, C, D ) ) );
为了清楚起见,添加了换行符。好吧,编译器抱怨的原因很明显,我想知道我还打算做什么来强制BOOST_PP_ARRAY_ELEM
扩展?