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 ...
随机推荐
- 用 npm 搭建vue项目
一.开发环境 vue推荐开发环境: Node.js: javascript运行环境(runtime),不同系统直接运行各种编程语言 npm: Nodejs下的包管理器. webpack: 它主要的用途 ...
- Magicodes.IE在.NET Core中通过请求头导出多种格式文件
前言 在2.2里程碑中我们增加了一些新的功能,正如标题所写通过请求头进行导出我们不同格式的文件.下面我们来看一下如何使用.通过这种方式无论是对我们的数据多用途,还是说对我们的数据校验都做到了轻松易配. ...
- Spring Boot 整合 Apollo
简介 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限.流程治理等特性,适用于微服务配置管理场景 ...
- skywalking与pinpoint全链路追踪方案对比
由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...
- 新来的"大神"用策略模式把if else给"优化"了,技术总监说:能不能想好了再改?
本文来自作者投稿,原作者:上帝爱吃苹果 目前在魔都,贝壳找房是我的雇主,平时关注一些 java 领域相关的技术,希望你们能在这篇文章中找到些有用的东西.个人水平有限,如果文章有错误还请指出,在留言区一 ...
- Spring9——通过用Aware接口使用Spring底层组件、环境切换
通过用Aware接口使用Spring底层组件 能够供我们使用的组件,都是Aware的子接口. ApplicationContextAware:实现步骤: (1)实现Applic ...
- vue 生命周期钩子 路由钩子 动画钩子 执行顺序
进入首页的钩子们 1 路由钩子 路由跳转前beforeEach 2 路由钩子 home组件内部:守卫执行前beforeRouteEnter 3.路由钩子 路由跳转后afterEach 4 生命周期 h ...
- js事件入门(2)
2.鼠标事件 鼠标事件就是用户与页面的许多交互时通过鼠标移动或者鼠标点击等触发的事件. 2.1.onmousedown 鼠标按下的时候触发的事件 <!DOCTYPE html> <h ...
- 基于AOP和ThreadLocal实现日志记录
基于AOP和ThreadLocal实现的一个日志记录的例子 主要功能实现 : 在API每次被请求时,可以在整个方法调用链路中记录一条唯一的API请求日志,可以记录请求中绝大部分关键内容.并且可以自定义 ...
- models.py连接mysql
安装pymysql: other setting---project Interpreter---+pymysql 更改数据库 在项目名的同名文件下的settings.py中DATABASES,改成 ...