1,函数模板的定义
template<typename T1,typename T2> T1 my_fun(T1 v1, T2 v2);
注意:
- 函数模板的形参表不能为空;
- 定义模板形参时,既可以用typename,也可以用class,两者没有区别;
- 每一个模板形参前都要加关键字typename或class,不能用下面的形式:
template<typename T1, T2> T1 my_fun(T1 v1, T2 v2)
2,inline函数模板
函数模板与普通的函数一样,可以声明为inline,放在形参表之后,返回类型之前
template<typename T1,typename T2> inline T1 my_fun(T1 v1, T2 v2);
注意:与定义inline函数不同,这里的inline不是放在最前面。
3,例子
1,一个简单的例子
template<typename T> T get_bigger(const T &v1, const T &v2)
{
return v1 > v2 ? v1 : v2;
}
int main()
{
cout << "get_bigger(520, 3132):"<<get_bigger(520, 3132) << endl;
cout << "get_bigger(1.73, 31.32):"<<get_bigger(1.73, 31.32) << endl;
system("pause");
return 0;
}
运行结果:
分别用整型和double型去调用这个函数模板,都得到了正确的结果。
2,试想,如果一个参数是整型,一个参数是double型会怎样?
修改代码为如下所示:
template<typename T> T get_bigger(const T &v1, const T &v2)
{
return v1 > v2 ? v1 : v2;
}
int main()
{
cout << "get_bigger(1.73, 3132):" << get_bigger(1.73, 3132) << endl;
system("pause");
return 0;
}
因为我们只定义了一种模板形参T,第一个参数1.73让T实例化double,但是第二个参数3132让T实例化为int,发生冲突,所以报错。
在这里3132是不可能自动由int转成doube的。
3,一个更隐晦的例子
template<typename T> T get_bigger(const T &v1, const T &v2)
{
return v1 > v2 ? v1 : v2;
}
int main()
{
cout << "get_bigger(hi, world):" << get_bigger("hi", "world") << endl;
system("pause");
return 0;
}
运行起来会怎样呢?
再次编译出错!
从出错信息可以看到,“hi”的类型是const char[3],而“hello”的类型是 const char[6],两者的类型并不相同。
归根结底的原因是:字符串字面值并不是一种类型,他是用字符数组的形式实现的,而字符数组长度不同就是不同的类型。
解决方法是,将它们都转成string类型
template<typename T> T get_bigger(const T &v1, const T &v2)
{
return v1 > v2 ? v1 : v2;
}
int main()
{
string s1 = "hi";
string s2 = "world";
cout << "get_bigger(hi, world):" << get_bigger(s1, s2) << endl;
system("pause");
return 0;
}
运行结果: