我们正在使用第三方 C 库,它提供了printf()
-style 日志功能,
void log(const char *format, ...);
由于不值得讨论的原因,我们需要限制记录消息的速率,类似于
void rate_limited_log(const char* format, ...)
{
if (<not too fast>) {
log(format, ...);
}
}
幸运的是,C 库的作者知道他们在做什么,并提供了
void logv(const char* format, va_list ap);
所以写上面的函数是一件比较简单的事情。不幸的是,可变参数函数不能很好地使用 inlining,所以我想出了第二个解决方案:
template <typename... T>
void rate_limited_log(const char* format, T&&... args)
{
if (<not too fast>) {
log(format, std::forward<T>(args)...);
}
}
这完美地工作并根据我们的需要内联速率限制条件。但我有几个问题:
将参数包扩展为像这样的 C 风格的可变参数函数调用在 C++11 中是合法的、定义明确的事情,还是我们很幸运它可以工作?
鉴于我们正在调用 C 函数,这里是否真的有
&&
必要?如果我使用,甚至只是按价值,无论有没有 ,std::forward
它似乎都可以正常工作。const T&
T
std::forward