1

我正在重构一些现有的样板代码,并意识到 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扩展?

4

0 回答 0