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?
再添加一轮括号:
MACRO_EXAMPLE(([i, j](){}));
// ^ ^
Run Code Online (Sandbox Code Playgroud)
否则,前面的部分,被解释为宏的第一个参数,而后面的部分,被解释为宏的第二个参数.
作为@SingerofTheFall答案的替代方法(它可以在调用宏时解决问题),您还可以通过使其可变,在宏本身中解决问题:
#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)
通过允许预处理器将,标记处的lambda解析为多个参数,然后再次使用所有这些参数和分隔的逗号来工作,因此最终的效果就是您想要的。
| 归档时间: |
|
| 查看次数: |
1987 次 |
| 最近记录: |