加qq1126137994 微信:liu1126137994 一起学习更多技术!!!

1、函数模板深入理解

  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 为 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、总结

  1. 函数模板通过具体的参数类型匹配不同的函数
  2. 函数模板可以定义任意多个不同的类型参数
  3. 函数模板中函数发的返回值类型必须显示指定
  4. 函数模板可以像普通函数一样被重载

【C++深度剖析教程36】深入理解函数模板相关推荐

  1. 【C++的深度剖析教程21】类型转换函数下

    上一篇文章写了关于普通类型转换为类类型的语法与性质,今天我们来看一下:类类型如何转换为普通类型. 一.类型转换函数: C++类中,可以定义类型转换函数,类型转换函数用于将类对象转换为其他类型. 语法规 ...

  2. 【C++的深度剖析教程20】类型转换函数上

    今天来学习类型转换函数. 一回顾 我们学习C语言的时候,都知道,标准的数据类型之间,是可以做类型的转换的.分为隐式类型转换和强制类型转换.那么强制类型转换呢,比较简单.但是隐式类型转换,却存在诸多问题 ...

  3. 【C语言进阶】带你深度剖析那些常见的字符函数(一)

    前言 在C语言的学习中,C语言中对字符和字符串的处理很是频繁,所以今天本文是针对有关字符串的函数进行深度剖析,下面我会介绍函数的功能,如何使用,参数,模拟实现等方面来进行讲述,希望本文对你有所帮助. ...

  4. 【C++深度剖析教程35】函数模板的概念和意义

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.问题引入: C++中有几种变量交换的方法? 定义宏代码块和定义函数 #include <iostream ...

  5. 【C++深度剖析教程39】实现C++数组类模板

    上一篇文章在那个学习了多参数类模板与特化的分析:点击链接查看上一篇文章:类模板深度剖析 本篇文章学习记录: 数值型模板参数 实现C++数组类模板 1.模板中的数值型参数 模板参数可以是数值型参数.也就 ...

  6. 【C++深度剖析教程38】类模板深度剖析

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化: 指定类模板的特定实现 部分类型参数必须 ...

  7. string类有可以调换方向的函数吗_深度剖析C++中的inline函数

    点蓝色字关注"CurryCoder" 微信公众号:CurryCoder的程序人生 怕什么真理无穷,进一寸有一寸的欢喜 1.inline函数的爱恨两难 内联函数比宏优点好很多,详细原 ...

  8. 【C++深度剖析教程37】类模板的概念和意义

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.类模板 一些类主要用于存储和组织数据元素 类中数据的组织方式和数据元素的具体类型无关 如 数组类,链表类,st ...

  9. 【C++深度剖析教程7】C++之类中的函数重载

    函数重载的回顾(接上一篇文章): 函数重载的本质为相互独立的不同的函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到重载函数的入口地址 函数重载必然发生在同一个作用域中 类中的成员 ...

最新文章

  1. Mybatis中的模糊查询
  2. Yeslab安全实验室CCNP Security PPT到货
  3. python具体应用过程_python公开课|Python for循环的具体应用就是python流程控制的核心,想学会就来看看...
  4. Eric Brewer大神
  5. 【转】两厢车与三厢车安全性哪个好?
  6. android 5.0 qq状态栏颜色,Android 沉浸式状态栏(QQ5.0透明状态栏的效果)
  7. BZOJ4538 HNOI2016网络(树链剖分+线段树+堆/整体二分+树上差分)
  8. 数组循环移动 空间复杂度O(1)
  9. PRO/E配置文件选项
  10. 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
  11. MIMO技术杂谈(一)浅谈分集与复用的权衡_akala啦_新浪博客
  12. Postman发送请求失败报错“Error: getaddrinfo ENOTFOUND xxx.xxx.xxx.xxx“
  13. 去除安卓apk中的广告
  14. 宏基掠夺者圣盾5000、圣盾3000 评测
  15. FL Studio第 24 个年头:Image-Line 升级 FL Studio 21 音乐工作站
  16. 趣味python3编程_Python趣味编程与精彩实例
  17. 带有播放列表的网页播放器
  18. vue+vant仿微信聊天画面做了个点击按钮出现土味情话的界面
  19. Rocksdb prefix Bloomfilter
  20. AX2012小问题总结

热门文章

  1. 第五十六期:IPv6只是增加了地址数量?其实真相并没有那么简单!
  2. 67 cookie常用方法
  3. 实例11:python
  4. C++三路比较运算符
  5. idea中如何将一个普通项目转换为maven项目
  6. 使多个线程循环输出0-99-0-99
  7. (Oracle)关于blob转到目标库报ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值错误解决方案...
  8. 程序的灵魂-----算法
  9. PHP实现敏感词过滤系统
  10. myeclipse上进行tomcat远程调试