可变参数模板可以将某些类型的函数重写为更干净、类型安全的版本。情况就是这样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<typename T, typename... Args>
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 的可变参数版本会被复制很多次。这对于大型函数或类来说可能很糟糕。
可变参数模板是否与代码重复的标准模板一样危险?如果是,继承技巧还有帮助吗?