Являются ли вариативные шаблоны потенциальным раздуванием кода?

Вариативные шаблоны позволят переписать определенные функции в более чистые, печатные безопасные версии. Это случай 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 будет скопирована много раз. Это может быть ужасно для больших функций или классов.

Являются ли вариативные шаблоны такими же опасными, как стандартные шаблоны для дублирования кода? Если да, может ли уловка наследования все еще помочь?

6
задан dandan78 10 November 2011 в 15:23
поделиться