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:取得当前日期是一个星期中的第几天,注 ...
随机推荐
- 为了完成这个功能,我竟然用5行代码制作了一个EXE可执行程序
由于用户访问我们某个网址的路径比较长,最后我们确定了在桌面添加快捷入口的方案,让用户点击快捷入口直接进入直接的网址,而且这个快捷入口要带有指定的logo(排除了新建url快捷方式的方案),所以我决定写 ...
- Leetcode之回溯法专题-77. 组合(Combinations)
Leetcode之回溯法专题-77. 组合(Combinations) 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输 ...
- python小白短期基础入门
一.编程语言介绍与分类 1.什么是编程语言 编程语言本质就是人类的语言,主要用于沟通交流.我们通过编程语言与计算机进行互动交流,从而使计算机来帮助我们实现一些特定的功能和一些复杂的工作. 2.编程语言 ...
- JSON转换方法解析
JSON.parse() 与 JSON.stringify() 的区别 JSON.parse() :是从一个字符串中解析出 json 对象 JSON.stringify():是从一个对象中解析出字符串 ...
- (一)spring aop的两种配置方式。
sring aop的方式有两种:(1)xml文件配置方式(2)注解的方式实现,我们可以先通过一个demo认识spring aop的实现,然后再对其进行详细的解释. 一.基于注解的springAop配置 ...
- c# autofac结合WebApi的使用
一.下载相关类库引用 install-package Autofac install-package Autofac.Mvc4 install-package Autofac.WebApi2 二.配置 ...
- 杭电多校 hdu6627 equation
http://acm.hdu.edu.cn/showproblem.php?pid=6627 题意:解绝对值方程并统计解的个数. 解法:签到题,直接模拟小学数学学的零点分段法即可.(数据多直接cin, ...
- POJ 1077 Eight (BFS+康托展开)详解
本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...
- “玲珑杯”ACM比赛 Round #18 C -- 图论你先敲完模板(和题目一点关系都没有,dp)
题目链接:http://www.ifrog.cc/acm/problem/1146?contest=1020&no=2 题解:显然知道这是一道dp而且 dp[i]=min(dp[j]+2^(x ...
- The Suspects POJ1611
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 36417 Accepted: 17681 De ...