Передача аргументов шаблона переменной в функцию переменной
Мы используем стороннюю библиотеку 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);
поэтому написание вышеупомянутой функции является относительно простым делом. К сожалению однаковариадические функции не очень хорошо работают с встраиваниеми вот я придумал второе решение:
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, или нам просто повезло, что это работает?
Являются ли&&
а такжеstd::forward
на самом деле необходимо здесь, учитывая, что мы вызываем функцию C? Кажется, работает так же хорошо, если я используюconst T&
или даже простоT
по стоимости, с или безstd::forward
.