可变参数模板将使某些函数能够重写为更加清晰、类型安全的版本。以 printf
为例,就像在 维基百科 上给出的示例一样:
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
的可变参数版本将被复制多次。对于大型函数或类,这可能会很糟糕。
可变参数模板是否像标准模板那样危险,容易造成代码重复? 如果是,继承技巧是否仍然适用?