带有lambda参数的c++宏使用2+捕获元素生成错误

C++ macro with lambda argument using 2+ captured elements generates error

本文关键字:元素 错误 参数 lambda c++ 带有      更新时间:2023-10-16
foo(const std::function<void()>& functor) {
    ....
}
#define MACRO_EXAMPLE(functor) foo(functor)
int main() {
    int i = 0, j = 0;
    MACRO_EXAMPLE([i](){}); // works fine
    MACRO_EXAMPLE([i, j](){}); // error: macro "MACRO_EXAMPLE" passed 2 arguments, but takes just 1
  });
}

为什么?如何让宏理解lambda ?

再加一轮括号:

MACRO_EXAMPLE(([i, j](){}));
//            ^          ^

否则,之前的部分被解释为宏的第一个参数,,之后的部分被解释为宏的第二个参数

作为@SingerofTheFall的答案(在调用宏时修复问题)的替代方案,您还可以在宏本身中修复问题,通过将其设置为可变的:

#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)

这是通过允许预处理器将,标记处的lambda解析为多个参数来工作的,但然后再次使用所有这些参数和分隔逗号,因此净效果是您想要的。