泛型编程概念:不考虑具体数据类型的编程方式;

函数模板:

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++ 函数模板用法的更多相关文章

  1. Template function 函数模板用法

    #include<iostream> using namespace std; const double PI = 3.1415926; template <class T> ...

  2. c++ 左值右值 函数模板

    1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...

  3. C++ sort()函数的用法

    C++sort()函数的用法 C++sort()函数的用法 近来看了c++标准库这本书,学到了很多,就把这其中的一点C++sort()函数的用法写下来和大家分享吧! (一)为什么要用c++标准库里的排 ...

  4. [转]C++函数模板与模板函数

      1.函数模板的声明和模板函数的生成   1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. ...

  5. 结构体与C++sort()函数的用法

    C++sort()函数的用法 先看道题(本题来自http://codeup.cn/第26099): 题目描述 [问题描述] 高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束 ...

  6. Matlab中imfilter()函数的用法

    Matlab中imfilter()函数的用法 功能:对任意类型数组或多维图像进行滤波.用法:B = imfilter(A,H) B = imfilter(A,H,option1,option2,... ...

  7. C++函数模板详解(一):概念和特性

    函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...

  8. c++11-17 模板核心知识(一)—— 函数模板

    1.1 定义函数模板 1.2 使用函数模板 1.3 两阶段翻译 Two-Phase Translation 1.3.1 模板的编译和链接问题 1.4 多模板参数 1.4.1 引入额外模板参数作为返回值 ...

  9. 有关日期的函数操作用法总结,to_date(),trunc(),add_months();

    相关知识链接: Oracle trunc()函数的用法 oracle add_months函数 Oracle日期格式转换,tochar(),todate() №2:取得当前日期是一个星期中的第几天,注 ...

随机推荐

  1. 在Keras中使用VGG进行物体识别(直接使用)

    https://blog.csdn.net/baimafujinji/article/details/80700263

  2. mysql函数拼接查询concat函数

    //查询表managefee_managefee的年year 和 month ,用concat函数拼成year-month.例如将2017和1 拼成2017-01.. select CONCAT(a. ...

  3. Visual Studio 2019 远程调试工具(Remote Debugger)使用方法

    目录 0.Visual Studio 2019 远程调试工具使用场景 1.Visual Studio 2019 远程调试工具下载地址: 2.Visual Studio 2019 远程调试工具-安装及运 ...

  4. vue-cli2.X中引入高德地图,将其设为全局对象

    平时一般未用脚手架构建或用webpack构建的项目只要用script标签引入即可,在vue-cli 2.X构建的项目中,需要用如下方式引入高德地图: 首先在高德地图开放平台中注册开发者账号并获取key ...

  5. StackOverflow 周报 - 与高关注的问题过过招(Java)

    本篇文章是 Stack Overflow 周报的第二周,共收集了 4 道高关注的问题和对应的高赞回答.公众号「渡码」为日更,欢迎关注. DAY1.  serialVersionUID 的重要性 关注: ...

  6. BALNUM - Balanced Numbers(数位dp)

    题目链接:http://www.spoj.com/problems/BALNUM/en/ 题意:问你在[A,B]的闭区间内有几个满足要求的数,要求为每个出现的奇数个数为偶数个,每个出现的偶数个数为奇数 ...

  7. CODE[VS] 3269 混合背包

    3269 混合背包  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 背包体积为V ,给出N ...

  8. Python起源发展与学(ru)习(keng)的开篇

    写在前面,python天下第一!!!!!我要做python的舔狗

  9. tomcat,nginx日志定时清理

    1. Crontab定时任务 Crontab 基本语法 t1 t2 t3 t4 t5 program 其中 t1 是表示分钟,t2 表示小时,t3 表示一个月份中的第几日,t4 表示月份,t5 表示一 ...

  10. C++ STL vector的学习

    vector就是一个不定长数组,vector是动态数组,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素,使用vector之前,必须包含相应的头文件和命名空间. #include <vec ...