【C++深度剖析教程36】深入理解函数模板
加qq1126137994 微信:liu1126137994 一起学习更多技术!!!
1、函数模板深入理解
- 编译器从函数模板通过具体类型产生不同的函数
- 编译器会对函数模板进行两次编译
*对模板进行编译
*对参数替换后的函数进行编译
注意事项:
函数模板本身不允许隐式类型转换
- 调用函数自动推倒类型时必须严格匹配类型
- 显示类型指定时,能够进行隐式类型转换
#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 为 intFuncD* pd = Swap; // 编译器自动推导 T 为 double// FuncT* pt = Swap; // 编译器自动推导 T 为 Testcout << "pi = " << reinterpret_cast<void*>(pi) << endl;cout << "pd = " << reinterpret_cast<void*>(pd) << endl;// cout << "pt = " << reinterpret_cast<void*>(pt) << endl;return 0;
}
函数模板可以定义任意多个不同类型的参数
对于多参数模板
*无法自动推倒函数的返回值类型
*可以从左向右部分指定类型参数
工程中将返回值参数作为第一个类型参数
#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 = doubleint r1 = Add<int>(0.5, 0.8);// T1 = double, T2 = float, T3 = doubledouble r2 = Add<double, float>(0.5, 0.8);// T1 = float, T2 = float, T3 = floatfloat r3 = Add<float, float, float>(0.5, 0.8);cout << "r1 = " << r1 << endl; // r1 = 1cout << "r2 = " << r2 << endl; // r2 = 1.3cout << "r3 = " << r3 << endl; // r3 = 1.3return 0;
}
2、函数重载与函数模板
当函数重载遇上函数模板会发生什么?
函数模板可以像普通函数一样被重载:
- C++编译器优先考虑普通函数
- 如果函数模板可以产生一个更好的匹配,则优先使用函数模板
- 可以通过空模板实参列表,来限制编译器只匹配模板
#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;
}
3、总结
- 函数模板通过具体的参数类型匹配不同的函数
- 函数模板可以定义任意多个不同的类型参数
- 函数模板中函数发的返回值类型必须显示指定
- 函数模板可以像普通函数一样被重载
【C++深度剖析教程36】深入理解函数模板相关推荐
- 【C++的深度剖析教程21】类型转换函数下
上一篇文章写了关于普通类型转换为类类型的语法与性质,今天我们来看一下:类类型如何转换为普通类型. 一.类型转换函数: C++类中,可以定义类型转换函数,类型转换函数用于将类对象转换为其他类型. 语法规 ...
- 【C++的深度剖析教程20】类型转换函数上
今天来学习类型转换函数. 一回顾 我们学习C语言的时候,都知道,标准的数据类型之间,是可以做类型的转换的.分为隐式类型转换和强制类型转换.那么强制类型转换呢,比较简单.但是隐式类型转换,却存在诸多问题 ...
- 【C语言进阶】带你深度剖析那些常见的字符函数(一)
前言 在C语言的学习中,C语言中对字符和字符串的处理很是频繁,所以今天本文是针对有关字符串的函数进行深度剖析,下面我会介绍函数的功能,如何使用,参数,模拟实现等方面来进行讲述,希望本文对你有所帮助. ...
- 【C++深度剖析教程35】函数模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.问题引入: C++中有几种变量交换的方法? 定义宏代码块和定义函数 #include <iostream ...
- 【C++深度剖析教程39】实现C++数组类模板
上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...
- 【C++深度剖析教程38】类模板深度剖析
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...
- string类有可以调换方向的函数吗_深度剖析C++中的inline函数
点蓝色字关注"CurryCoder" 微信公众号:CurryCoder的程序人生 怕什么真理无穷,进一寸有一寸的欢喜 1.inline函数的爱恨两难 内联函数比宏优点好很多,详细原 ...
- 【C++深度剖析教程37】类模板的概念和意义
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...
- 【C++深度剖析教程7】C++之类中的函数重载
函数重载的回顾(接上一篇文章): 函数重载的本质为相互独立的不同的函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员 ...
最新文章
- Mybatis中的模糊查询
- Yeslab安全实验室CCNP Security PPT到货
- python具体应用过程_python公开课|Python for循环的具体应用就是python流程控制的核心,想学会就来看看...
- Eric Brewer大神
- 【转】两厢车与三厢车安全性哪个好?
- android 5.0 qq状态栏颜色,Android 沉浸式状态栏(QQ5.0透明状态栏的效果)
- BZOJ4538 HNOI2016网络(树链剖分+线段树+堆/整体二分+树上差分)
- 数组循环移动 空间复杂度O(1)
- PRO/E配置文件选项
- 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
- MIMO技术杂谈(一)浅谈分集与复用的权衡_akala啦_新浪博客
- Postman发送请求失败报错“Error: getaddrinfo ENOTFOUND xxx.xxx.xxx.xxx“
- 去除安卓apk中的广告
- 宏基掠夺者圣盾5000、圣盾3000 评测
- FL Studio第 24 个年头:Image-Line 升级 FL Studio 21 音乐工作站
- 趣味python3编程_Python趣味编程与精彩实例
- 带有播放列表的网页播放器
- vue+vant仿微信聊天画面做了个点击按钮出现土味情话的界面
- Rocksdb prefix Bloomfilter
- AX2012小问题总结