文章目录

  • 定义
  • 声明
  • 调用方式
  • 函数模版的重载
  • 函数模版的特点

工作中一个同事写了测试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++ 泛型编程 -- 函数模版相关推荐

  1. C++ 泛型编程(五) 模版重载与特例化

    前文回顾: C++ 泛型编程(一) 基本概念 C++ 泛型编程(二) 函数模版 C++ 泛型编程(三) 模版实参推断 C++ 泛型编程(四) 类模板 模版重载 函数模版可以被另一个模版或者一个普通非模 ...

  2. hdu 1286 找新朋友 欧拉函数模版题

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Des ...

  3. 函数 的 重载 和 函数 模版

    1 //函数的重载对一个函数名 赋予它 多重意义 就成为函数的重载 2 //在函数重载的基础上 我们仍然对那种 实现功能相似 3 // 但是 函数类型和形参不确定的 情况下 产生了 函数 模版 4 # ...

  4. C++模版 (一) ----- 函数模版

    写在前面 函数模版的声明 template<typename T> 函数模版的使用 // 该函数模版只对其下面的一个函数有效 template <typename T> voi ...

  5. 实用经验 92 区分函数模版与模版函数,类模版和模板类

    模板就是实现代码重用机制的一种工具,它可实现类型参数化,即把类型定义为参数, 从而实现了代码的可重用性.模版可以分为两类,一个是函数模版,另外一个是类模版.在使用模板概念时,经常会遇到这4个概念:函数 ...

  6. c++中的函数模版和类模版

    因为使用模板可以使程序员建立具有通用类型的函数库和类库.模板也是C++语言支持参数化多态性的工具. 函数模板 函数模板能以同样的程序代码对不同类型的数据进行处理,其关键是将所处理的数据类型说明为参数, ...

  7. 第十四周项目一-排序函数模版

    /* *Copyright(c)2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:123.cpp *作 者:王蕊 *完成日期:2016年6月1日 *版 本 ...

  8. 黄聪:ThinkSAAS开发文档 常用函数 模版修改

    首页 本文档适合任何级别的PHP开发者: 目录 [隐藏] 1 ThinkSAAS开源社区 1.1 快速了解 1.2 下载地址 2 APP组件开发 2.1 入门教程 3 APP插件开发 3.1 入门教程 ...

  9. C++ 泛型编程-函数模板

    和java泛型类似 逻辑相同,类型不同 模板函数template<class T> 模板声明必须紧跟着函数,只能对一个函数起作用 编译器会对函数模板进行两次编译,在声明的地方对模板代码本身 ...

最新文章

  1. Spark-Spark setMaster WordCount Demo
  2. Django:数据库表的建立与增删查改(ForeignKey和ManytoMany)
  3. asp.net基础中Get和Post的区别。
  4. 树莓派 Raspberry Pi 更换国内源
  5. mysql排序区分大小写吗_MySQL操作数据时区分大小写
  6. 自动化集成:Jenkins管理工具详解
  7. vue.js java php_听说Java程序员喜欢AngularJS,PHP程序员喜欢Vue.js
  8. switch开关 ~ 学习记录
  9. 规模数据导入高效方式︱将数据快速读入R—readr和readxl包
  10. Linux 中安装软件报缺少共享库文件的错误
  11. Spring启动过程——源码分析(finishBeanFactoryInitialization(beanFactory))
  12. 深入解析Windows操作系统(笔记4)
  13. 华三路由交换配置命令_H3C路由器常用基本配置命令
  14. mysql索引左倾_MySQL索引学习
  15. python算日期_python中的日期计算
  16. 独孤求败-小滴云架构大课十八式-xdclass2022
  17. Docker【1】 | 带你快速了解Docker,So easy
  18. WiFi通信模块框图
  19. 高等数学学习笔记——第三十二讲——泰勒公式
  20. 蓝桥杯 模板Template Part10:AT24C02存储器

热门文章

  1. nodejs文件上传报错总结
  2. PetaPoco - 轻量级高性能的ORM框架(支持.NET Core)
  3. Android WebView使用与JavaScript使用
  4. WebApi2官网学习记录---异常处理
  5. 将ADS1.2的工程迁移到KEIL上-基于2440
  6. 【C++自我精讲】基础系列二 const
  7. 用TCP/IP进行网际互联一
  8. 小脚本,统计一个目录下满足特定条件文件的代码行数
  9. 替换WCF默认序列化方式
  10. html中section与div,如何在html中的section标签内包含div标签