c++ - 迭代可变参数宏参数

标签 c++ c c-preprocessor

我正在以编程方式生成一堆仿函数,为了使生成的代码更具可读性,我正在尝试提出一个宏来扩展以下行,

SET_STATE(FunctorA,a,b);

ref a;
ref b;
FunctorA(ref a, ref b){
   this->a = a;
   this->b = b;
}

基本上它将扩展到第一个参数构造函数。可变参数部分是构造函数的参数数量。是否可以在宏内部循环并在预处理期间生成此代码,即使它对这种特殊情况没有意义,但我有一些具有 20 个左右变量的仿函数,它们可以访问它会清理我生成的代码很多。

所有参数的类型相同,只有名称不同。

最佳答案

如果 boost::preprocessorSEQ 表示((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/

相关文章:

c++ - 为什么要声明一个 double 组来存储一个整数(C++)

c - string是数组还是指针?

ios - 如何在#define中将整个数组作为参数传递?

在 "could not access file $libdir/..."中为 Postgres 11 结果创建扩展

C程序-找出上面最低的学生分数,和下面的最高分数

c++ - 多行注释和换行

c - 这两段代码的工作

c++ - 输入句子并将其转换为字符串

C++ 层次结构打印练习

c++ - 继承 : expected class-name before ‘{’ token