gpt4 book ai didi

c++ - Varargs 宏执行函数调用或将其转换为字符串

转载 作者:行者123 更新时间:2023-11-28 04:24:24 26 4
gpt4 key购买 nike

我想选择性地调用函数或将其转换为字符串(打印出来)。以下不起作用:

#if !defined(ENABLE_FUNCS)
#define APPLY(func, ...) do { (func(__VA_ARGS__); } while(0)
#else
#define APPLY(func, ...) \
do {std::clog << #func << #__VA_ARGS__ << std::endl;} while(0)
#endif
...

APPLY(openlog, ((name.size() ? name.data() : nullptr), flags, facility);

有什么想法吗?

最佳答案

如果您愿意使用可变参数模板而不是 VA_ARGS,请考虑以下针对 ENABLE_FUNCS 情况的定义:

template <typename F, typename... Args>                     
void apply(F&& f, Args&&... args) {
std::initializer_list<int> l{
(std::forward<F>(f)(std::forward<Args>(args)), 0)...
};
(void) l; // Silence compiler warnings
}

std::initializer_list 为我们提供了一种以给定顺序对每个参数调用 f 的方法。我们对逗号运算符使用了一些 hack,让表达式计算为 int,这样 l 就可以很好地定义为任何返回类型 f 可能有。

最后,如果ENABLE_FUNCS没有定义,你可以提供apply的定义:

template <typename F, typename... Args>          
void apply(F&&, Args&&... args) {
std::initializer_list<int> l{
(cout << std::forward<Args>(args), 0)...
};
cout << endl;
(void) l;
}

我们使用与之前相同的策略,使用 initializer_list,但在这种情况下,我们将每个参数转发给您的记录器。

关于c++ - Varargs 宏执行函数调用或将其转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54717886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com