使用2+捕获元素的lambda参数的C++宏会产生错误

fhd*_*sYa 3 c++ macros lambda

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
  });
}
Run Code Online (Sandbox Code Playgroud)

为什么?如何让宏了解lambdas?

Sin*_*all 7

再添加一轮括号:

MACRO_EXAMPLE(([i, j](){}));
//            ^          ^
Run Code Online (Sandbox Code Playgroud)

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


Rei*_*ica 5

作为@SingerofTheFall答案的替代方法(它可以在调用宏时解决问题),您还可以通过使其可变,在宏本身中解决问题:

#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

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