C ++如何在宏调用后平衡括号?

C++ how can I balance the brackets after the macro call?

#define function(...) [](){ DO_STUFF(__VA_ARGS__)

由于宏中的左括号,我留下了一个丑陋的用法,缺少括号或额外的括号。有办法解决这个问题吗?

function(a, b, c)
    foo();
}
function(a, b, c){
    foo();
}}

您可以使用 c++14 中引入的 lambda 捕获初始化程序:

template <class...Args>
int do_stuff(Args&& ... args)
{
    ((std::cout << args),...); // <-this requires c++17 and is just for illustration.
    return 1;
}

#define myfunction(...) [dummy##__LINE__=do_stuff(__VA_ARGS__)]()

int main() {    

    auto f = myfunction(1,2,3,4,5){std::cout<< "balanced" << std::endl;};
    f();
    return 0;
}

输出:

12345balanced

这是一个 live demo。为此,do_stuff 必须 return 除了 void 之外的其他东西。

警告我不确定是否允许编译器删除未使用的捕获值。