C++学习笔记54——函数模板

来源:互联网 发布:php自动跳转url 编辑:程序博客网 时间:2024/05/28 18:44

1,函数模板的定义

template<typename T1,typename T2> T1 my_fun(T1 v1, T2 v2);


注意:
  1. 函数模板的形参表不能为空;
  2. 定义模板形参时,既可以用typename,也可以用class,两者没有区别;
  3. 每一个模板形参前都要加关键字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;}

让get_bigger()同时获得一个int和double参数,编译失败:
因为我们只定义了一种模板形参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;}
运行结果:



0 0
原创粉丝点击