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

后端 未结 2 697
长发绾君心
长发绾君心 2021-01-19 04:59
foo(const std::function& functor) {
    ....
}

#define MACRO_EXAMPLE(functor) foo(functor)

int main() {
    int i = 0, j = 0;
    MACRO_EXAMPLE([         


        
相关标签:
2条回答
  • 2021-01-19 05:36

    Add one more round of parenthesis:

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

    Otherwise the part before , is interpreted as macro's first parameter, and the part after , is interpreted as the macro's second parameter.

    0 讨论(0)
  • 2021-01-19 05:48

    As an alternative to @SingerofTheFall's answer (which fixes the problem when invoking the macro), you can also fix the problem in the macro itself, by making it variadic:

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

    This works by allowing the preprocessor to parse the lambda at , tokens into multiple arguments, but then uses all of these arguments and the separating commas again, so the net effect is what you want.

    0 讨论(0)
提交回复
热议问题