Passando argumentos do Modelo Variadic para uma Função Variadic
Estamos usando uma biblioteca C de terceiros que fornece umaprintf()
função de log de estilo
void log(const char *format, ...);
Por razões que não valem a pena abordar, precisamos limitar a taxa na qual as mensagens são registradas, algo como
void rate_limited_log(const char* format, ...)
{
if (<not too fast>) {
log(format, ...);
}
}
Felizmente, os autores da biblioteca C sabiam o que estavam fazendo e forneceram
void logv(const char* format, va_list ap);
portanto, escrever a função acima é uma questão relativamente simples. Infelizmente, porémfunções variadas não funcionam bem com inlining, então eu vim com uma segunda solução:
template <typename... T>
void rate_limited_log(const char* format, T&&... args)
{
if (<not too fast>) {
log(format, std::forward<T>(args)...);
}
}
Isso funciona perfeitamente e alinha a condição de limitação da taxa como gostaríamos. Mas tenho algumas perguntas sobre isso:
A expansão de um pacote de parâmetros em uma chamada de função variadica no estilo C como esta é uma coisa legal e bem definida a ser feita no C ++ 11, ou apenas tivemos sorte de funcionar?
São as&&
estd::forward
realmente necessário aqui, já que estamos chamando uma função C? Parece funcionar tão bem se eu usarconst T&
ou mesmo apenasT
por valor, com ou semstd::forward
.