printf()
-スタイルのログ機能を提供するサードパーティの C ライブラリを使用しています。
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ではうまく機能しないため、2 番目の解決策を思いつきました。
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関数を呼び出しているとすれば、実際にここで
&&
andが必要ですか? を使用しても、値だけでもstd::forward
、 を使用しても使用しなくても、同様に機能するようです。const T&
T
std::forward