C++学习笔记54——函数模板
来源:互联网 发布:php自动跳转url 编辑:程序博客网 时间:2024/05/28 18:44
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;}运行结果:
0 0
- 【C++】学习笔记四十三——函数模板
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(1)——函数模板定义
- C++ Template学习笔记之函数模板(7)——重载函数模板
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++ Template学习笔记之函数模板(3)——模板实参推演
- C++ Template学习笔记之函数模板(5)——模板编译模式
- C++Template学习笔记之函数模板
- (C/C++学习笔记)函数模板加强
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++ Template学习笔记之函数模板(2)——函数模板实例化
- C++学习笔记54——函数模板
- C++ Template学习笔记之函数模板(4)——显式模板实参
- C++ Template学习笔记之函数模板(6)——模板显式特化
- C++ Template学习笔记之函数模板(4)——显式模板实参
- C++ Template学习笔记之函数模板(6)——模板显式特化
- java中重载与重写的区别
- 理解之软件需求说明书
- 以同一张银行卡取钱为例,演示同步多线程方法
- 破窗理论与中学课堂
- Constructing module maps for integrated analysis of heterogeneous biological networks
- C++学习笔记54——函数模板
- 【BZOJ1095】【ZJOI2007】捉迷藏 括号序列+线段树维护
- JMS探讨二 ActiveMq
- Linux使用RPM方式安装MySQL
- C语言宏定义和宏定义函数
- 使用多线程方法生成一个死锁程序
- 【OpenCV】矩阵的创建与释放
- sed应用举例
- 蓝桥杯历届-移动距离