C++语法小记---函数模板
函数模板
函数模板的目的是代码复用
普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数
模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译
函数模板调用特点:
不进行隐式类型转换
返回值不能进行自动推倒
普通函数和模板函数形成重载时,可以显示的调用模板函数
建议:将返回值类型作为第一个模板参数
#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++语法小记---函数模板的更多相关文章
- C++语法小记---类模板
类模板 类模板和函数模板类似,主要用于定义容器类 类模板可以偏特化,也可以全特化,使用的优先级和函数模板相同 类模板不能隐式推倒,只能显式调用 工程建议: 模板的声明和实现都在头文件中 成员函数的实现 ...
- C++语法小记---函数重载
函数重载 函数重载的本质是对已有功能的扩展 构成重载的三大条件 函数名相同 参数列表不通(与返回值无关) 重载函数的作用域相同 成员函数之间可以重载,成员函数和静态成员函数之间可以构成重载,全局函数之 ...
- C++语法小记---函数对象
函数对象 用于替代函数指针 优势:函数对象内部可以保存状态,而不必使用全局变量或静态局部变量 关键:重载"()"操作符 #include<iostream> #incl ...
- Jinja2语法小记
jinja2模板语法小记 Jinja2模板中文文档 三种常见界定符 表达式 {{ ... }} 用于装载字符串.变量.函数调用等 语句 {% ... %} 用于装载控制语句,比如if判断.for循环等 ...
- [c++][语言语法]函数模板和模板函数 及参数类型的运行时判断
参考:http://blog.csdn.net/beyondhaven/article/details/4204345 参考:http://blog.csdn.net/joeblackzqq/arti ...
- C++STL - 函数模板
模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...
- C++-函数模板特化如何避免重复定义
我正在用一个基于模板的库源代码,该库包含一些针对特定类型的模板函数特化.类模板,函数模板和模板函数特化都在头文件中.我在我的.cpp文件中 #include 头文件并编译链接工程.但是为了在整个工程 ...
- C++学习33 函数模板
在<C++函数重载>一节中,为了求三个数的最大值,我们通过函数重载定义了三个名字相同.参数列表不同的函数,如下所示: //求三个整数的最大值 int max(int a, int b, i ...
- c++的函数模板和类模板
函数模板和普通函数区别结论: 函数模板不允许自动类型转化 普通函数能够进行自动类型转换 函数模板和普通函数在一起,调用规则: 1 函数模板可以像普通函数一样被重载 2 C++编译器优先考虑普通函数 3 ...
随机推荐
- Redis - (Linux)安装与配置
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: 1:Redis支持数据的持久化,可以将内存 ...
- android异步任务asyncTask详细分析
android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...
- 9、ssh的集成方式2
1.在第一种的集成方式中,通过struts2-spring-plugin-2.1.8.1.jar这个插件让spring自动产生对应需要的action类,不需要在对应的spring.xml文件中进行配置 ...
- Python实用笔记 (19)面向对象编程——访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- 高速缓存一致性协议MESI与内存屏障
一.CPU高速缓存简单介绍 CPU高速缓存机制的引入,主要是为了解决CPU越来越快的运行速度与相对较慢的主存访问速度的矛盾.CPU中的寄存器数量有限,在执行内存寻址指令时,经常需要从内存中读取指令所需 ...
- 恕我直言你可能真的不会java第11篇-Stream API终端操作
一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...
- 什么才是市场急需的前端工程师?要价1.8W,HR不敢还嘴!
据统计,国外的前端开发人员和后端开发人员比例约1:1,但是在国内比例却在1:3以下, Web前端开发职位人才缺口巨大.前端工程师的发展之路十分有“钱”景. 每天,HR 群都有人在吐槽招不到前端工程师. ...
- python基础知识练习3
1.如何实现 "1,2,3" 变成 ['1','2','3'] ? 如何实现['1','2','3']变成[1,2,3] ?(代码题) # 第一个问题 str1 = "1 ...
- css样式大全,完整的Css样式大全(整理)
CSS样式被称为为“层叠样式表”,是一种网页制作做不可或缺的技术,是用于装饰网页,达到设计效果的一种样式语言,下面将整理一下css常用样式: 字体属性:(font) 大小 {font-size: x- ...
- 03.springboot 整合RabbitMQ
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...