目录

  • 模板函数:机制介绍
  • 模板函数:实现
  • 代码

模板函数:机制介绍

在很多时候,我们需要对不同的数据类型做一些操作,但是这些操作是相同的,比如求取一个数组中的最大元素,我们只需:

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++ 模板函数 讲解及实现相关推荐

  1. C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】

    目录 前言 C++函数模板的使用 函数模板语法 1.模板说明 2.函数定义 3.函数模板调用 模板函数 函数模板和函数重载 嵌套使用函数模板 函数模板和普通函数在一起,调用规则 在Linux中反汇编查 ...

  2. php 模板 原理,php模板原理讲解

    php模板原理讲解 复制代码 代码如下: $data = array( 'title'=>'ilsea', 'list'=>array( 'hello', 'world' ) ); inc ...

  3. 13.Django中几大常用模板标签讲解及实战使用 【for循环;if判断;页面跳转;开启关闭自动转义;url携带参数传递;注释】

    1.常用模板标签 (1)模板标签重要概念: ①定义:标签在渲染的过程中提供任意的逻辑. ②标签语法: 由 {% 和 %} 来定义的,例如:{%tag%} {%endtag%}   (2)常用模板标签讲 ...

  4. 【线段树】【模板】讲解 + 例题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(区间加值) ...

  5. python transpose函数_numpy中transpose和swapaxes函数讲解

    1 transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: arr=np.arange(16).reshape( ...

  6. render 函数讲解

    render 函数讲解 render 函数即渲染函数,它是个函数,它的参数也是个函数--即 createElement,我们重点来说 createElement 参数. render 函数的返回值(V ...

  7. 【C++】模板函数的声明和定义必须在同一个文件中

    1.问题描述 习惯性的将函数的定义和实现,分别写在头文件和源文件(.cpp)中.今天也按照这个习惯实现了一个模板函数.然后编译时报错 ... error: undefined reference to ...

  8. avascript中的this与函数讲解

    徐某某 一个半路出家的野生程序员 javascript中的this与函数讲解 前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大 ...

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

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

最新文章

  1. c 多线程运行混乱_一篇文章读懂 Python 多线程
  2. 将扫描字符转换成点阵信息
  3. 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码
  4. HTML5 Boilerplate - 让页面有个好的开始
  5. 23种设计模式C++源码与UML实现--外观模式
  6. python3安装常见问题_python3中pip的安装、常见问题及万能解决方案。
  7. 撒花!中文翻译仓库链接已加入 ML.NET 官方示例网站首页
  8. deepin linux grub,deepin linux 安装之后 引导错误 出现 grub
  9. PyTorch热身小案例
  10. GoogLeNet模型
  11. OpenGL基础34:帧缓冲(中)之附件
  12. CSS安全字体的写法
  13. python主函数调用子函数,实现excel数据写入
  14. 【第8题】求 s=a+aa+aaa+aaaa+aa...a 的值
  15. LivePlayer.js播放器遇到悬停英文提示如何切换显示成中文
  16. 面试逻辑题和答案(二)
  17. re管理器改android版本,RE管理器历史版本
  18. ionic2 tab切换控制
  19. 如何才能成为一个成熟的投资者?
  20. labview和c语言,到底哪个更好:LabVIEW还是C语言?

热门文章

  1. 如何写出高效的软件测试用例?
  2. C4D 英文界面设置为中文界面
  3. 聚焦|成亮:离元宇宙最近的技术—数字孪生
  4. DaiXT:Spring-AOP-使用注解完成环绕时间打印
  5. 电压测试软件中文,System Information Viewer(SIV主板电压温度测试)
  6. mysql学习笔记 基础命令
  7. CF 8C Looking for Order
  8. 转子接地保护原理_转子接地保护原理
  9. bootstrap tips
  10. AD 域服务简介(一)