57-深入理解函数模版
来源:互联网 发布:java开发机器人 编辑:程序博客网 时间:2024/06/05 07:57
1、函数模版理解
第一次编译:对模版代码本身进行编译,查看语法错误等
第二次编译:对模版参数替换后的代码进行编译
2、注意事项
#include <iostream>#include <string>using namespace std;class Test{ Test(const Test&);public: Test() { }};template < typename T >void Swap(T& a, T& b){ T c = a; a = b; b = c;}typedef void(FuncI)(int&, int&);typedef void(FuncD)(double&, double&);typedef void(FuncT)(Test&, Test&);int main(){ FuncI* pi = Swap; // 编译器自动推导 T 为 int,编译对应的类型函数 FuncD* pd = Swap; // 编译器自动推导 T 为 double // FuncT* pt = Swap; // 编译器自动推导 T 为 Test,然后编译对应类型的swap函数, //在swap中T c = a;执行了拷贝构造函数(private的)会报错。证明存在第二次编译。,第二次编译会对替换后的代码进行编译 cout << "pi = " << reinterpret_cast<void*>(pi) << endl; cout << "pd = " << reinterpret_cast<void*>(pd) << endl; // cout << "pt = " << reinterpret_cast<void*>(pt) << endl; return 0;}
3、多个参数
4、
函数模版参数第一个参数代表返回值,要求必须显示指定类型
#include <iostream>#include <string>using namespace std;template < typename T1, typename T2, typename T3 >T1 Add(T2 a, T3 b){ return static_cast<T1>(a + b);}int main(){ // T1 = int, T2 = double, T3 = double int r1 = Add<int>(0.5, 0.8); // T1 = double, T2 = float, T3 = double double r2 = Add<double, float>(0.5, 0.8); // T1 = float, T2 = float, T3 = float float r3 = Add<float, float, float>(0.5, 0.8); cout << "r1 = " << r1 << endl; // r1 = 1 cout << "r2 = " << r2 << endl; // r2 = 1.3 cout << "r3 = " << r3 << endl; // r3 = 1.3 return 0;}r1 = 1r2 = 1.3r3 = 1.3
5、问题
6、
#include <iostream>#include <string>using namespace std;//三者之间构成重载的关系;template < typename T >T Max(T a, T b){ cout << "T Max(T a, T b)" << endl; return a > b ? a : b;}int Max(int a, int b){ cout << "int Max(int a, int b)" << endl; return a > b ? a : b;}template < typename T >T Max(T a, T b, T c){ cout << "T Max(T a, T b, T c)" << endl; return Max(Max(a, b), c);}int main(){ int a = 1; int b = 2; //优先考虑普通函数,再根据参数匹配个数,参数类型的推导是否匹配进行选择 cout << Max(a, b) << endl; // 编译器优先考虑,普通函数 Max(int, int) //存在<>符号时直接查找模版函数,另外有两个参数,直接调用对应的函数模版 cout << Max<>(a, b) << endl; // 函数模板 Max<int>(int, int) cout << Max(3.0, 4.0) << endl; // 函数模板 Max<double>(double, double) cout << Max(5.0, 6.0, 7.0) << endl; // 函数模板 Max<double>(double, double, double) //函数模板不会进行隐式类型转换,所以只能去找普通函数,然后隐式类型转换 cout << Max('a', 100) << endl; // 普通函数 Max(int, int) return 0;}int Max(int a, int b)2T Max(T a, T b)2T Max(T a, T b)4T Max(T a, T b, T c)T Max(T a, T b)T Max(T a, T b)7int Max(int a, int b)100
7、小结
阅读全文
0 0
- 57-深入理解函数模版
- 深入理解JavaScript函数
- 深入理解sizeof()函数
- 深入理解指针函数
- 深入理解指针函数
- sizeof()函数深入理解
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- 深入理解指针函数
- js操作剪贴板,实现点击按钮复制文本功能
- Navicat for MySQL界面下如何用SQL语句创建表?
- octave安装使用
- WebPack详细入门教程(一)之简介
- linux 自定义脚本服务
- 57-深入理解函数模版
- Java 代码运行洞察库 Metrics
- 2017-10-31课堂作业02
- Doctype简析
- BZOJ 4803(逆欧拉函数-搜索)
- SQL注入之报错型注入
- 简单的收获和理解
- ArangoDB入门教程(三)java连接ArangoDB数据库
- 第42届ACM国际大学生程序设计竞赛 亚洲区域赛 西安站 总结