是否可以将模板生成的函数设为f()
和f<T>()
?
我想在大多数情况下使用指定的类型调用f,例如:
f<string>();
f<int>();
但我也需要这样称呼它:
f();
和未指定的类型应该是字符串。这可能吗?
答案 0 :(得分:9)
template <typename T>
void f() { ... }
void f() { f<string>(); }
答案 1 :(得分:8)
您可以为模板参数指定默认类型:
template<class T=std::string>
foo()
注意:如果为模板类提供默认参数,则必须使用Foo<>
声明默认版本。调用模板化函数时不需要这样做;您可以调用不带尖括号的默认版本:foo()
另一个注意事项:由于模板参数推断,这适用于函数。引用标准(2012年1月草案§14.8.2.5)强调我的:
使用得到的替换和调整的函数类型作为 模板参数推导的函数模板的类型。 如果是 模板参数尚未推断,其默认模板参数, 如果有的话,使用。 [例如:
template <class T, class U = double>
void f(T t = 0, U u = 0);
void g() {
f(1, ’c’); //f<int,char>(1,’c’)
f(1); //f<int,double>(1,0)
f(); //error: T cannot be deduced
f<int>(); //f<int,double>(0,0)
f<int,char>(); //f<int,char>(0,0)
}
答案 2 :(得分:2)
#include <string>
template <typename T=std::string>
void f() {}
int main()
{
f();
}