模板函数的使用
template<typename T> void TempFun(T a)
{
cout << a << endl;
}
int main()
{
TempFun(1); //实例化为TempFun<const int>(1)
TempFun("1"); //实例化为TempFun<const char *>(1)
}
在编译器解析到函数调用TempFun (1)的时候,发现fun是一个函数模板,这时候编译器就会根据实参1的类型const int推导实例化模板函数void TempFun<cons tint>(int),再进行调用,相应的,对于TempFun (“1”)类似,实例化模板函数的参数类型将是const char*。
模板函数的默认模板参数
函数模板在C++98中与类模板一起被引入,不过在模板类声明的时候,标准允许其有默认模板参数,而模板函数直到C++11才支持,不过类模板默认参数,必须遵照“从右到左”的规则进行指定,而这个条件对函数模板并不是必须的。
template<typename T1, typename T2 = int> class AClass; //类模板-编译正常
template<typename T1, typename T2 = int> void AFun(T1 a, T2 b); //函数模板-编译正常
template<typename T1 = int, typename T2> class BClass; //类模板-无法通过
template<typename T1 = int, typename T2> void BFun(T1 a, T2 b); //函数模板-正常编译
函数模板的参数推导规则并不复杂,简单地讲,如果能从函数实参中推导出类型的话,那么默认模板参数就不会被使用,反之,默认模板参数可能被使用。如下例:
template<typename T1, typename T2 = double>
void Foo(T1 t = 0, T2 b = 0) {};
int main()
{
Foo(1, 'c'); //Foo<int, char>(1,'c')
Foo(1); //Foo<int, double>(1,0),使用了默认模板参数double
Foo(); //错误
Foo<int>(); //Foo<int, double>(0,0),使用了默认模板参数double
Foo<int, char>(); //Foo<int, char>(0,0)
}