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面试专题
Redis面试专题 1. 什么是redis? Redis 是一个基于内存的高性能key-value数据库. (有空再补充,有理解错误或不足欢迎指正) 2. Reids的特点 Redis本质上是一个Ke ...
- IDEA+Maven+Tomcat构建Web项目的三种方法
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 本文将介绍三种方 ...
- 看完这篇 HashMap,和面试官扯皮就没问题了
HashMap 概述 如果你没有时间细抠本文,可以直接看 HashMap 概述,能让你对 HashMap 有个大致的了解. HashMap 是 Map 接口的实现,HashMap 允许空的 key-v ...
- SpringCloud 入门(三)
前文我们介绍了简单的创建一个客户端,并介绍了它是如何提供服务的,接下来介绍它的另外一个组件:zuul. zuul 提供了微服务的网关功能,通过它提供的接口,可以转发不同的服务,可以当作一个中转站. 搭 ...
- activity的四种启动模式详细分析
1.android中通过任务队列来管理activity 采用栈的结构就是后进先出 手机里面如果启动多个应用就会启动多个任务栈来管理对应的activity. 主要解决下面的问题:对应的四种启动模式: 1 ...
- 个人作业——软件工程实践总结&个人技术博客
一. 回望 (1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强软件工程专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪 ...
- Spring源码系列(二)--bean组件的源码分析
简介 spring-bean 组件是 Spring IoC 的核心,我们可以使用它的 beanFactory 来获取所需的对象,对象的实例化.属性装配和初始化等都可以交给 spring 来管理. 本文 ...
- 在Ubuntu上实现人脸识别登录
安装Howdy: howdy项目地址 sudo add-apt-repository ppa:boltgolt/howdy sudo apt update sudo apt install howdy ...
- could not resolve property(无法解析属性)
could not resolve property(无法解析属性) 顾名思义在写hql语句的时候,属性写错了! 请检查大小写,是实体类的,不是数据库表的! 一个一个检查,仔细看!
- MySQL 8.0 主从同步
一.简介 一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中.MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器 ...