C++ 模板函数 讲解及实现
目录
- 模板函数:机制介绍
- 模板函数:实现
- 代码
模板函数:机制介绍
在很多时候,我们需要对不同的数据类型做一些操作,但是这些操作是相同的,比如求取一个数组中的最大元素,我们只需:
for(int i=0; i<arr.size(); i++)if(arr[i] > max_val) max_val = arr[i];
可是面对不同的数据类型,我们需要实现不同的函数,比如下面我们需要实现两个函数来选择int
或者double
数组中的最大值,非常麻烦
int array_max(vector<int> arr)
{int max_val = arr[0];for(int i=0; i<arr.size(); i++)if(arr[i] > max_val) max_val = arr[i];return max_val;
}double array_max(vector<double> arr)
{double max_val = arr[0];for(int i=0; i<arr.size(); i++)if(arr[i] > max_val) max_val = arr[i];return max_val;
}
而模板函数机制则提供了一种灵活的组织方式,我们不需要告诉函数具体的形参数据类型,而只用专注于函数功能的实现
注意:在python中这种机制被很好的执行,如下是python的数组求最大:
def array_max(arr):val = arr[0]for item in arr:if item > val:val = itemreturn val
你看,任何数据类型,只要支持[]
下标运算和>
比较运算,都可以使用这个函数,这就是【模板函数】机制在python理解下的实现
模板函数:实现
在实现函数之前,添加关键词:template<class 类型>
比如下面这个例子,可实现传入任意支持 ++
运算的数据类型(包括重载了++算符的自定义数据类型),并且对其++
可以简单的认为:T就是传入数据类型的别名,真正执行的时候,会把T换成传入的数据类型,比如传入int,那么所有的T替换成int
template<class T>
T add(T data)
{data++;return data;
}
多个同类形参:比如我们实现交换函数swap,交换两个同类型的变量
template<class T>
void my_swap(T& o1, T& o2)
{T temp = o1;o1 = o2;o2 = temp;
}
多类型多变量:template内容必须按照形参表顺序,比如我们定义函数my_print
来输出两种不同类型的变量
template<class T1, class T2>
void my_print(T1 o1, T2 o2)
{cout<<o1<<" "<<o2<<endl;
}
值得注意的是,template<>
里面的内容必须和函数的形参表完全一一对应,因为编译器会按实际调用时传入的数据类型,一一对应他们的别名
错误示范:
template<class T1, class T2, class T3>
void add_dif(T2 a, T3 b, T1 aaa)
{}
// main函数:
add_dif(1.23, 4.77, 1);// 编译器抛出错误:
[Error] in passing argument 1 of void add_dif(T2, T3, T1)
[with T1 = int; T2 = double; T3 = double]
正确写法:
template<class T1, class T2, class T3>
void add_dif(T1 a, T2 b, T3 aaa)
{}
注意如果函数返回值要返回模板类型T的数据,那么也要在形参表中添加T,即使函数没有用到,但为了编译通过并且顺利建立别名映射,必须添加
代码
首先使用模板函数add,将任意数据类型++后输出
然后使用模板函数my_swap交换两个任意的同类数据
然后使用模板函数my_print打印两个任意的数据类型(可不同也可相同)
#include <bits/stdc++.h>using namespace std;template<class T>
T add(T data)
{data++;return data;
}template<class T>
void my_swap(T& o1, T& o2)
{T temp = o1;o1 = o2;o2 = temp;
}template<class T1, class T2>
void my_print(T1 o1, T2 o2)
{cout<<o1<<" "<<o2<<endl;
}int main()
{ cout<<add(114)<<endl;cout<<add(123.45)<<endl;cout<<add('a')<<endl<<endl;string s1="world", s2="hello";my_swap(s1, s2);cout<<s1<<" -- "<<s2<<endl<<endl;my_print(123, "zsbd");return 0;
}
C++ 模板函数 讲解及实现相关推荐
- C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】
目录 前言 C++函数模板的使用 函数模板语法 1.模板说明 2.函数定义 3.函数模板调用 模板函数 函数模板和函数重载 嵌套使用函数模板 函数模板和普通函数在一起,调用规则 在Linux中反汇编查 ...
- php 模板 原理,php模板原理讲解
php模板原理讲解 复制代码 代码如下: $data = array( 'title'=>'ilsea', 'list'=>array( 'hello', 'world' ) ); inc ...
- 13.Django中几大常用模板标签讲解及实战使用 【for循环;if判断;页面跳转;开启关闭自动转义;url携带参数传递;注释】
1.常用模板标签 (1)模板标签重要概念: ①定义:标签在渲染的过程中提供任意的逻辑. ②标签语法: 由 {% 和 %} 来定义的,例如:{%tag%} {%endtag%} (2)常用模板标签讲 ...
- 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)
[线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...
- python transpose函数_numpy中transpose和swapaxes函数讲解
1 transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: arr=np.arange(16).reshape( ...
- render 函数讲解
render 函数讲解 render 函数即渲染函数,它是个函数,它的参数也是个函数--即 createElement,我们重点来说 createElement 参数. render 函数的返回值(V ...
- 【C++】模板函数的声明和定义必须在同一个文件中
1.问题描述 习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中.今天也按照这个习惯实现了一个模板函数.然后编译时报错 ... error: undefined reference to ...
- avascript中的this与函数讲解
徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...
- [转]C++函数模板与模板函数
1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板 ...
最新文章
- c 多线程运行混乱_一篇文章读懂 Python 多线程
- 将扫描字符转换成点阵信息
- 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码
- HTML5 Boilerplate - 让页面有个好的开始
- 23种设计模式C++源码与UML实现--外观模式
- python3安装常见问题_python3中pip的安装、常见问题及万能解决方案。
- 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页
- deepin linux grub,deepin linux 安装之后 引导错误 出现 grub
- PyTorch热身小案例
- GoogLeNet模型
- OpenGL基础34:帧缓冲(中)之附件
- CSS安全字体的写法
- python主函数调用子函数,实现excel数据写入
- 【第8题】求 s=a+aa+aaa+aaaa+aa...a 的值
- LivePlayer.js播放器遇到悬停英文提示如何切换显示成中文
- 面试逻辑题和答案(二)
- re管理器改android版本,RE管理器历史版本
- ionic2 tab切换控制
- 如何才能成为一个成熟的投资者?
- labview和c语言,到底哪个更好:LabVIEW还是C语言?