函数模板
  • 函数模板的目的是代码复用

  • 普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数

  • 模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译

  • 函数模板调用特点:

    • 不进行隐式类型转换

    • 返回值不能进行自动推倒

    • 普通函数和模板函数形成重载时,可以显示的调用模板函数

  • 建议:将返回值类型作为第一个模板参数

 #include <iostream>
#include <string> using namespace std; template<typename T>
void Swap(T& l, T& r)
{
T tmp = l;
l = r;
r = tmp;
} template<typename T>
T add(T l, T r)
{
cout<<"T add(T l, T r)"<<endl;
return l + r;
} int add(int l, int r)
{
cout<<"add(int l, int r)"<<endl;
return l + r;
} template<typename T1, typename T2>
T1 func(T2 param) //将返回值作为第一个参数类型
{
return static_cast<T1>(param);
} int main()
{
int a = ;
int b = ;
Swap(a, b);
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl; add(a, b); //add(int l, int r), 优先调用普通函数
add(1.1, 2.2); //T add(T l, T r), 普通函数不匹配,然后匹配模板函数 add<>(a, b); //显式调用模板函数
add<int>(a, b); //显式调用模板函数 cout<<"func<int>(1.2) = "<< func<int>(1.2) << endl; //只指定返回值类型,参数类型自动推导 return ;
}
  • 函数模板只能全特化,不能偏特化

  • 函数模板、特化模板以及普通函数可以构成重载,优先调用普通函数,其次调用特化模板,最后调用函数模板

 #include <iostream>
#include <string> using namespace std; template<typename T1, typename T2> //函数模板
void add(T1 l, T2 r)
{
cout << "void add(T1 l, T2 r)" << endl;
} template<>
void add<int>(int l, int r) //全特化模板
{
cout << "void add<int>(int l, int r)" << endl;
} void add(int i, int r) //普通函数
{
cout << "void show(int i, int r)" << endl;
} int main()
{
int a = ;
int b = ;
double c = 2.5; add(a, b); //void show(int i, int r)
add<>(a, b); //void add<int>(int l, int r)
add(a, c); //void add(T1 l, T2 r)
return ;
}
  • 在函数模板中,类型可以是参数, 变量也可以是参数
 #include <iostream>
#include <string> using namespace std; template<typename T1, int N> //函数模板
void add(T1 l, T1 r)
{
cout << "result = " << l + r <<endl;
cout << "N = " << N << endl;
} int main()
{
add<int, >(, ); //result = 3
//N = 10
return ;
}

C++语法小记---函数模板的更多相关文章

  1. C++语法小记---类模板

    类模板 类模板和函数模板类似,主要用于定义容器类 类模板可以偏特化,也可以全特化,使用的优先级和函数模板相同 类模板不能隐式推倒,只能显式调用 工程建议: 模板的声明和实现都在头文件中 成员函数的实现 ...

  2. C++语法小记---函数重载

    函数重载 函数重载的本质是对已有功能的扩展 构成重载的三大条件 函数名相同 参数列表不通(与返回值无关) 重载函数的作用域相同 成员函数之间可以重载,成员函数和静态成员函数之间可以构成重载,全局函数之 ...

  3. C++语法小记---函数对象

    函数对象 用于替代函数指针 优势:函数对象内部可以保存状态,而不必使用全局变量或静态局部变量 关键:重载"()"操作符 #include<iostream> #incl ...

  4. Jinja2语法小记

    jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...

  5. [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断

    参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...

  6. C++STL - 函数模板

    模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...

  7. C++-函数模板特化如何避免重复定义

     我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...

  8. C++学习33 函数模板

    在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...

  9. c++的函数模板和类模板

    函数模板和普通函数区别结论: 函数模板不允许自动类型转化 普通函数能够进行自动类型转换 函数模板和普通函数在一起,调用规则: 1 函数模板可以像普通函数一样被重载 2 C++编译器优先考虑普通函数 3 ...

随机推荐

  1. Spring 面试详解

    SpringSpring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地 ...

  2. Ubuntu k80深度学习环境搭建

    英伟达驱动安装 英伟达驱动下载:https://www.nvidia.cn/Download/driverResults.aspx/135493/cn/ 由于是驱动的冲突,那么自然是要杀掉和显卡结合不 ...

  3. Python 简明教程 ---10,Python 列表

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 程序 = 算法 + 数据结构 -- Nicklaus Wirth 目录 从这句话程序 = 算法 + ...

  4. 从发布-订阅模式谈谈 Flask 的 Signals

    发布-订阅模式 发布-订阅模式,顾名思义,就像大家订报纸一样,出版社发布不同类型的报纸杂志不同的读者根据不同的需求预定符合自己口味的的报纸杂志,付费之后由邮局安排人员统一派送. 上面一段话,提到了发布 ...

  5. centos6.4 卸载 vim7.2 安装vim7.4

    一.# rpm -qa|grep vim vim-minimal-7.2.-1.8.el6.x86_64 vim-enhanced-7.2.-1.8.el6.x86_64 vim-common-7.2 ...

  6. CenterOS的安装配置(配图解)

    CenterOS的安装配置 一.    配置虚拟机 打开Virtual Machine(虚拟机),点击create new virtual machine 进入新建虚拟机向导页面,选择[Custom( ...

  7. Windows系统VSCode、VBox搭建C/C++开发环境

    好几年没有写过C/C++代码,基本上都忘光了,之前是使用VC++6.0写代码的,最近用VSCode成功搭建了C/C++开发环境,这里记录一下搭建过程. 1. 安装VSCode 在官网https://c ...

  8. 03.springboot 整合RabbitMQ

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  9. Code Forces 833 A The Meaningless Game(思维,数学)

    Code Forces 833 A The Meaningless Game 题目大意 有两个人玩游戏,每轮给出一个自然数k,赢得人乘k^2,输得人乘k,给出最后两个人的分数,问两个人能否达到这个分数 ...

  10. .net Framework4 类库调用Jwt

    通过jwt源码,将其引用的Newtonsoft.Json.dll的9.0版本改为最新的12.0版本后重新生成以下文件. 下载地址: https://files.cnblogs.com/files/Zh ...