【发布时间】:2014-10-20 04:20:21
【问题描述】:
我们正在使用第三方C库,它提供了printf()风格的日志函数,
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);
所以写上面的函数是一件比较简单的事情。然而不幸的是variadic functions don't play well with 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,它似乎也能正常工作。
【问题讨论】:
标签: c++ c++11 variadic-templates variadic-functions perfect-forwarding