Pasar argumentos de plantilla variadic a una función variadic
Estamos utilizando una biblioteca C de terceros que proporciona unprintf()
función de registro de estilo,
void log(const char *format, ...);
Por razones por las que no vale la pena entrar, debemos limitar la velocidad a la que se registran los mensajes, algo similar a
void rate_limited_log(const char* format, ...)
{
if (<not too fast>) {
log(format, ...);
}
}
Afortunadamente, los autores de la biblioteca C sabían lo que estaban haciendo y proporcionaron
void logv(const char* format, va_list ap);
así que escribir la función anterior es una cuestión relativamente simple. Desafortunadamente sin embargolas funciones variadas no juegan bien con la alineación, y entonces se me ocurrió una segunda solución:
template <typename... T>
void rate_limited_log(const char* format, T&&... args)
{
if (<not too fast>) {
log(format, std::forward<T>(args)...);
}
}
Esto funciona perfectamente y alinea la condición de limitación de velocidad como nos gustaría. Pero tengo un par de preguntas al respecto:
¿Expandir un paquete de parámetros a una llamada de función variable de estilo C como esta es algo legal y bien definido para hacer en C ++ 11, o simplemente tenemos suerte de que funcione?
Son los&&
ystd::forward
realmente necesario aquí, dado que estamos llamando a una función C? Parece que funciona igual de bien si usoconst T&
o incluso soloT
por valor, con o sinstd::forward
.