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:取得当前日期是一个星期中的第几天,注 ...
随机推荐
- Java性能测试从入门到放弃-概述篇
Java性能测试从入门到放弃-概念篇 辅助工具 Jmeter: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试.JMeter 可以用于对服务器.网络 ...
- Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions)
Leetcode之深度优先搜索(DFS)专题-130. 被围绕的区域(Surrounded Regions) 深度优先搜索的解题详细介绍,点击 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O) ...
- 通过sql命令建表 和 主外键约束以及其他约束
create table命令 create table dept ( dept_id int primary key, dept_name ) not null, dept_address ) ) c ...
- Spring 核心技术(7)
接上篇:Spring 核心技术(6) version 5.1.8.RELEASE 1.6 定制 Bean 的特性 Spring Framework 提供了许多可用于自定义 bean 特性的接口.本节将 ...
- 2019DX#6
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Salty Fish 16.28%(7/43) OK 1002 Nonsense Tim ...
- hdu2222 Keywords Search (AC自动机板子
https://vjudge.net/problem/HDU-2222 题意:给几个模式串和一个文本串,问文本串中包含几个模式串. 思路:贴个板子不解释. #include<cstdio> ...
- CodeForces 620D Professor GukiZ and Two Arrays 双指针
Professor GukiZ and Two Arrays 题解: 将a数组都sort一遍之后, b数组也sort一遍之后. 可以观察得到 对于每一个ai来说, 整个数组bi是一个V型的. 并且对于 ...
- 面向对象程序设计(Java) 第2周学习指导及要求
面向对象程序设计(Java)第2周学习指导及要求 (2019.9.3-2019.9.9) 学习目标 适应老师教学方式,能按照自主学习要求完成本周理论知识学习: 掌握Java Application ...
- 单细胞转录组测序数据的可变剪接(alternative splicing)分析方法总结
可变剪接(alternative splicing),在真核生物中是一种非常基本的生物学事件.即基因转录后,先产生初始RNA或称作RNA前体,然后再通过可变剪接方式,选择性的把不同的外显子进行重连,从 ...
- 【Spring】 AOP Base
1. AOP概述 2. AOP的术语: 3. AOP底层原理 4. Spring 中的AOP 4.1 概述 4.2 分类 4.3 Spring的传统AOP 针对所有方法的增强:(不带有切点的切面) 带 ...