C++ C++;使用2+;捕获的元素生成错误 foo(const std::function和functor){ .... } #定义宏\u示例(函子)foo(函子) int main(){ int i=0,j=0; 宏_示例([i](){});//工作正常 MACRO_-EXAMPLE([i,j](){});//错误:宏“MACRO_-EXAMPLE”传递了2个参数,但只接受1个参数 }); }
为什么??如何使宏理解lambdas?再添加一轮括号:C++ C++;使用2+;捕获的元素生成错误 foo(const std::function和functor){ .... } #定义宏\u示例(函子)foo(函子) int main(){ int i=0,j=0; 宏_示例([i](){});//工作正常 MACRO_-EXAMPLE([i,j](){});//错误:宏“MACRO_-EXAMPLE”传递了2个参数,但只接受1个参数 }); },c++,lambda,macros,C++,Lambda,Macros,为什么??如何使宏理解lambdas?再添加一轮括号: 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](){}); //
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
});
}
否则,,
之前的部分将被解释为宏的第一个参数,,
之后的部分将被解释为宏的第二个参数。作为(调用宏时解决问题的)的替代方法,您也可以通过使其可变来解决宏本身的问题:
MACRO_EXAMPLE(([i, j](){}));
// ^ ^
这是通过允许预处理器将
,
标记处的lambda解析为多个参数来实现的,但随后再次使用所有这些参数和分隔的逗号,因此净效果就是您想要的。就。。。不要使用宏。
#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)