我正在以编程方式生成一堆仿函数,为了使生成的代码更具可读性,我正在尝试提出一个宏来扩展以下行,
SET_STATE(FunctorA,a,b);
ref a;
ref b;
FunctorA(ref a, ref b){
this->a = a;
this->b = b;
}
基本上它将扩展到第一个参数构造函数。可变参数部分是构造函数的参数数量。是否可以在宏内部循环并在预处理期间生成此代码,即使它对这种特殊情况没有意义,但我有一些具有 20 个左右变量的仿函数,它们可以访问它会清理我生成的代码很多。
所有参数的类型相同,只有名称不同。
最佳答案
如果 boost::preprocessor
和 SEQ
表示((a)(b)...
) 是允许的,
可能以下代码将达到目的:
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#define DEF_MEMBER( r, data, elem ) ref elem;
#define DEF_PARAM( r, data, i, elem ) BOOST_PP_COMMA_IF( i ) ref elem
#define DEF_ASSIGN( r, data, elem ) this->elem = elem;
#define SET_STATE( f, members ) \
BOOST_PP_SEQ_FOR_EACH( DEF_MEMBER,, members ) \
f( BOOST_PP_SEQ_FOR_EACH_I( DEF_PARAM,, members ) ) { \
BOOST_PP_SEQ_FOR_EACH( DEF_ASSIGN,, members ) \
}
SET_STATE(FunctorA,(a)(b))
以上代码扩展为
ref a; ref b; FunctorA( ref a , ref b ) { this->a = a; this->b = b; }
在我的环境中。
关于c++ - 迭代可变参数宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6194031/