Вариативные шаблоны позволят переписать определенные функции в более чистые, печатные безопасные версии. Это случай printf
, как пример, приведенный в Wikipedia :
void printf(const char *s)
{
while (*s) {
if (*s == '%' && *(++s) != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template
void printf(const char *s, T value, Args... args)
{
while (*s) {
if (*s == '%' && *(++s) != '%') {
std::cout << value;
++s;
printf(s, args...); // call even when *s == 0 to detect extra arguments
return;
}
std::cout << *s++;
}
throw std::logic_error("extra arguments provided to printf");
}
Но ... Насколько я понимаю шаблоны, они подразумевают дублирование кода для каждой комбинации типов. Таким образом, вариативная версия вышеупомянутых printf
s будет скопирована много раз. Это может быть ужасно для больших функций или классов.
Являются ли вариативные шаблоны такими же опасными, как стандартные шаблоны для дублирования кода? Если да, может ли уловка наследования все еще помочь?