C++ 函数模板用法
泛型编程概念:不考虑具体数据类型的编程方式;
函数模板:
1.提供一种特殊的函数可用不同类型进行调用;
2.与普通函数很相似,区别是类型可被参数化;
- template <typename T> //template关键字用于声明开始进行泛型编程
- void Swap(T &a, T &b) //typename关键字用于声明泛指类型
- {
- T tmp = a;
- a = b;
- b = tmp;
- }
函数模板的应用:
1.自动类型推导调用;
2.具体类型显示调用;
- int a = 3;
- int b = 4;
- Swap(a,b); //自动类型推导调用
- float fa = 5.5;
- float fb = 8.8;
- Swap<float>(fa, fb) //具体类型显示调用,用float替换参数类型T
使用演示:
- #include <iostream>
- template <typename T> //交换变量
- void Swap(T& a, T& b)
- {
- T t;
- t = a;
- a = b;
- b = t;
- }
- template <typename T> //将数组内容从小到大排序
- void SelectMin(T array[], int size)
- {
- for (int i = 0; i < size; i++)
- {
- T Min = array[i];
- int Index = 1;
- for (int j = i + 1; j < size; j++)
- {
- if (Min > array[j])
- {
- Min = array[j];
- Index = j;
- Swap(array[i], array[Index]);
- }
- }
- }
- }
- int main()
- {
- int a = 3;
- int b = 8;
- Swap(a, b); //自动类型推导
- std::cout << "a = " << a << std::endl;
- std::cout << "b = " << b << std::endl;
- float fa = 3.4;
- float fb = 8;
- Swap<float>(fa, fb); //具体类型显示调用
- std::cout << "fa = " << fa << std::endl;
- std::cout << "fb = " << fb << std::endl;
- char ca = 'a';
- char cb = 'b';
- Swap(ca, cb);
- std::cout << "ca = " << ca << std::endl;
- std::cout << "cb = " << cb << std::endl;
- int array[] = {4, 3, 1, 2, 45};
- SelectMin(array, 5);
- for (int i = 0; i < 5; i++)
- {
- std::cout << "i = " << array[i] << std::endl;
- }
- char array2[] = { 'a', 'f', 'e', 'c', 'b' };
- SelectMin(array2, 5);
- for (int i = 0; i < 5; i++)
- {
- std::cout << "i = " << array2[i] << std::endl;
- }
- return 0;
- }
函数模板的深入理解:
-- 编译器并不会把函数模板处理成能够处理任意类型的函数;
--编译器从函数模板通过具体类型产生不同的函数;
--编译器会对函数模板进行两次编译;
--在声明的地方对模板代码本身进行编译
--在调用的地方对参数替换后的代码进行编译
当函数模板遇到函数重载:
--C++编译器优先考虑普通函数;
--如果函数模板可以产生一个更好的匹配,那么选择模板;
--通过空模板实参列表的语法限定编译器只通过模板匹配;
注意事项:
--函数模板不允许自动类型转化;
--普通函数能够进行类型转化;
- int Max(int a, int b) //普通函数
- {
- return a > b ? a : b;
- }
- template <typename T> //模板函数
- T Max(T a, T b)
- {
- return a > b ? a : b;
- }
- int main()
- {
- int a = 4;
- int b = 8;
- Max(a,b); //调用普通函数
- Max<>(a,b); //空模板实参列表,只能调用函数模板
- float fa = 5.5;
- float fb = 8.8;
- Max(fa,fb); //调用普通函数会进行类型转换,通过函数模板会产生一个更好的匹配
- Max('a',100);//返回结果是调用普通函数a的ASCII码,因为‘a’是字符型,100是整形,与函数模板不匹配
return 0;- }
函数模板可以定义多个类型的参数:
- template <typename T1, typename T2, typename RT>
- RT Add(T1 a, T2 b) //RT作为返回类型
- {
- return static_cast<RT>(a+b)
- }
- cout<<Add<char, float, double>('a', 100)<<endl;
- 当声明的类型参数作为返回值类型,无法推导出返回值类型!
- 即Add('a', 100)这样自动推导调用编译器会报错;
- 不完美处理方案:
- template <typename RT, typename T1, typename T2>
- RT Add(T1 a, T2 b) //RT作为返回类型
- {
- return static_cast<RT>(a+b)
- }
- cout<<Add<double>('a', 100)<<endl; //将返回类型放在第一个参数,只显示的列出返回值类型,其它2个参数编译器自动推导
C++ 函数模板用法的更多相关文章
- Template function 函数模板用法
#include<iostream> using namespace std; const double PI = 3.1415926; template <class T> ...
- c++ 左值右值 函数模板
1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...
- C++ sort()函数的用法
C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...
- [转]C++函数模板与模板函数
1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. ...
- 结构体与C++sort()函数的用法
C++sort()函数的用法 先看道题(本题来自http://codeup.cn/第26099): 题目描述 [问题描述] 高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束 ...
- Matlab中imfilter()函数的用法
Matlab中imfilter()函数的用法 功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,... ...
- C++函数模板详解(一):概念和特性
函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...
- c++11-17 模板核心知识(一)—— 函数模板
1.1 定义函数模板 1.2 使用函数模板 1.3 两阶段翻译 Two-Phase Translation 1.3.1 模板的编译和链接问题 1.4 多模板参数 1.4.1 引入额外模板参数作为返回值 ...
- 有关日期的函数操作用法总结,to_date(),trunc(),add_months();
相关知识链接: Oracle trunc()函数的用法 oracle add_months函数 Oracle日期格式转换,tochar(),todate() №2:取得当前日期是一个星期中的第几天,注 ...
随机推荐
- 90002CAD相关操作
第一章 初识CAD 1.1 CAD能干什么 (1)绘制机械图/建筑图/装修图等二维复杂工程图的不二之选.二维设计软件的王者. (2)CAD可以绘制平面图.轴测图(二维线框表示三维图形).立体图(三 ...
- Android Studio启动模拟器失败
启动Android Studio的模拟器报“Emulator: Process finished with exit code -1073741819 (0xC0000005)”错误教程: 1.进入该 ...
- 创建ASP.NET Webservice
一.WebService:WebService是以独立于平台的方式,通过标准的Web协议,可以由程序访问的应用程序逻辑单元. (1)应用程序逻辑单元:web服务包括一些应用程序逻辑单元或者代码.这些代 ...
- win8,右键添加notepad++
1.下载并安装notepad++ 2.创建txt文件test1.txt,内容如下: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\ ...
- gym/102059 E
gym/102059 待通过:A.D.G.J.M 已补过:E E:电路题,判断一个图是不是简单电路.不需要特殊的技巧,利用set存图,把度数为2的点都删掉,融入到一条边上即可. #include &l ...
- codeforces 1041 E. Tree Reconstruction 和度数有关的构造树
CF 1041E:http://codeforces.com/contest/1041/problem/E 题意: 告诉你一个树的节点个数,显然有n-1条边.已知去掉一条边后,两个集合中最大的节点值. ...
- 不修改的主席(HJT)树-HDU2665,POJ-2104;
参考:优秀的B站视频: 和 https://blog.csdn.net/creatorx/article/details/75446472 感觉主席树这个思路是真的优秀,每次在前一次的线段树的基础 ...
- win、mac 设置 php上传文件大小限制
修改php.ini win平台WAMP修改 步骤 左键点击wamp 选择php 在弹出的窗口中选择php.ini 在打开的文件中进行修改(修改步骤如下) 修改完毕,保存并重启wamp mac MAM ...
- 自定义Hive UDAF 实现相邻去重
内置的两个聚合函数(UDAF) collect_list():多行字符串拼接为一行collect_set():多行字符串拼接为一行并去重多行字符串拼接为一行并相邻去重UDAF:Concat() con ...
- WEB应用中普通java代码如何读取资源文件
首先: 资源文件分两种:后缀.xml文件和.properties文件 .xml文件:当数据之间有联系时用.xml .properties文件:当数据之间没有联系时用.properties 正题: ...