C++ 泛型编程 -- 函数模版
文章目录
- 定义
- 声明
- 调用方式
- 函数模版的重载
- 函数模版的特点
工作中一个同事写了测试demo,想要自己尝试使用发现调用老出错,请教的时候发现是函数模版,有自己的调用方式,并且发现核心代码中大量的函数模版和类模版。
特此做一个函数模版相关的总结,为今后更加熟练的开发做好铺垫。
定义
C++中,存在泛型编程的概念:即不考虑具体数据类型的编程方式
函数模板是一种特殊的函数,可以使用不同的类型进行调用,对于功能相同的函数,不需要重复编写代码,并且函数模板与普通函数看起来很类似,区别就是类型可以被参数化
声明
函数模版的声明方式如下:
template <typename T, typename U ...>
void func(T arg1, U arg2 ,...){}
其中:
- template 声明开始进行泛型编程
- typename 声明泛指类型 ,即T
调用方式
- 类型的自动推导 调用 func2(a,b)
- 类型的指定推导 调用func2<int,int>(a,b)
实现如下:
#include <iostream>using namespace std;
template<typename T, typename U>
void func1() {T a;U b;cout << "T value is : " << typeid(a).name() << endl;cout << "U value is : " << typeid(b).name() << endl;
}template <typename T, typename U>
void func2(T a, U b) {T c = a + b;cout << "T value + U value is : " << c << endl;
}int main() {int a , b;a = 10;b = 11;/*第一种类型的template function 调用方式*/func2(a,b);/*第二种类型的template function 调用方式*/func1<char,int>();return 0;
}
输出如下:
T value + U value is : 21
T value is : c
U value is : i
函数模版的重载
- C++编译器优先考虑普通函数
- 如果函数模板可以产生一个更好的匹配,那么就选择函数模板
- 也可以通过空模板实参列表<>限定编译器只匹配函数模板
实现如下:
#include <iostream>using namespace std;/*func3 为重载函数*/
template <typename T>
void func3(T a) {cout << "funct3(T a) " << endl;
}template <typename T, typename U>
void func3(T a, U b) {cout << "func3(T a, U b)" << endl;
}void func3(int a, float b)
{cout << "fun3(int a, float b)" << endl;
}int main() {int c = 0;float d = 1.0;func3(c); //一个参数的模版函数func3(c,d);//调用普通函数fun3(int a, double b),能更完美好匹配func3(d,c);//第一个参数为double类型,则使用函数模版func3<>(c,d); //限定只能使用函数模版return 0;
}
输出如下:
funct3(T a)
fun3(int a, float b)
func3(T a, U b)
func3(T a, U b)
函数模版的特点
- 函数模板是泛型编程在C++中的应用方式之一
- 函数模板能够根据实参对参数类型进行推导
- 函数模板支持显式的指定参数类型
- 函数模板是C++中重要的代码复用方式
- 函数模板通过具体类型产生不同的函数
- 函数模板可以定义任意多个不同的类型参数
- 函数模板中的返回值类型必须显式指定
- 函数模板可以像普通函数一样重载
C++ 泛型编程 -- 函数模版相关推荐
- C++ 泛型编程(五) 模版重载与特例化
前文回顾: C++ 泛型编程(一) 基本概念 C++ 泛型编程(二) 函数模版 C++ 泛型编程(三) 模版实参推断 C++ 泛型编程(四) 类模板 模版重载 函数模版可以被另一个模版或者一个普通非模 ...
- hdu 1286 找新朋友 欧拉函数模版题
找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Des ...
- 函数 的 重载 和 函数 模版
1 //函数的重载对一个函数名 赋予它 多重意义 就成为函数的重载 2 //在函数重载的基础上 我们仍然对那种 实现功能相似 3 // 但是 函数类型和形参不确定的 情况下 产生了 函数 模版 4 # ...
- C++模版 (一) ----- 函数模版
写在前面 函数模版的声明 template<typename T> 函数模版的使用 // 该函数模版只对其下面的一个函数有效 template <typename T> voi ...
- 实用经验 92 区分函数模版与模版函数,类模版和模板类
模板就是实现代码重用机制的一种工具,它可实现类型参数化,即把类型定义为参数, 从而实现了代码的可重用性.模版可以分为两类,一个是函数模版,另外一个是类模版.在使用模板概念时,经常会遇到这4个概念:函数 ...
- c++中的函数模版和类模版
因为使用模板可以使程序员建立具有通用类型的函数库和类库.模板也是C++语言支持参数化多态性的工具. 函数模板 函数模板能以同样的程序代码对不同类型的数据进行处理,其关键是将所处理的数据类型说明为参数, ...
- 第十四周项目一-排序函数模版
/* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...
- 黄聪:ThinkSAAS开发文档 常用函数 模版修改
首页 本文档适合任何级别的PHP开发者: 目录 [隐藏] 1 ThinkSAAS开源社区 1.1 快速了解 1.2 下载地址 2 APP组件开发 2.1 入门教程 3 APP插件开发 3.1 入门教程 ...
- C++ 泛型编程-函数模板
和java泛型类似 逻辑相同,类型不同 模板函数template<class T> 模板声明必须紧跟着函数,只能对一个函数起作用 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身 ...
最新文章
- Spark-Spark setMaster WordCount Demo
- Django:数据库表的建立与增删查改(ForeignKey和ManytoMany)
- asp.net基础中Get和Post的区别。
- 树莓派 Raspberry Pi 更换国内源
- mysql排序区分大小写吗_MySQL操作数据时区分大小写
- 自动化集成:Jenkins管理工具详解
- vue.js java php_听说Java程序员喜欢AngularJS,PHP程序员喜欢Vue.js
- switch开关 ~ 学习记录
- 规模数据导入高效方式︱将数据快速读入R—readr和readxl包
- Linux 中安装软件报缺少共享库文件的错误
- Spring启动过程——源码分析(finishBeanFactoryInitialization(beanFactory))
- 深入解析Windows操作系统(笔记4)
- 华三路由交换配置命令_H3C路由器常用基本配置命令
- mysql索引左倾_MySQL索引学习
- python算日期_python中的日期计算
- 独孤求败-小滴云架构大课十八式-xdclass2022
- Docker【1】 | 带你快速了解Docker,So easy
- WiFi通信模块框图
- 高等数学学习笔记——第三十二讲——泰勒公式
- 蓝桥杯 模板Template Part10:AT24C02存储器