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 之外的其他东西。
警告我不确定是否允许编译器删除未使用的捕获值。
#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 之外的其他东西。
警告我不确定是否允许编译器删除未使用的捕获值。