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 ...
随机推荐
- [ C++ ] 勿在浮沙筑高台 —— 拾遗
explicit 主要用于处理一个参数的构造函数,使其不用于隐式类型转换(防止二义性) operator->() C++设计 ->可以一直保留下去 仿函数 仿函数会隐式继承他们中的一个(详 ...
- linux 在指定文件夹下查找指定字符
grep -r '119090610015743205' /data/html/www/gap_bz_middleware/storage/apiLogs/
- 暑假集训Day1 整数划分
题目大意: 如何把一个正整数N(N长度<20)划分为M(M>=1)个部分,使这M个部分的乘积最大.N.M从键盘输入,输出最大值及一种划分方式. 输入格式: 第一行一个正整数T(T<= ...
- github知名企业开源项目索引
亚马逊:https://github.com/amzn 饿了么 https://github.com/ElemeFEhttp://lrd.ele.me/腾讯 https://github.com/Te ...
- mac下创建安卓应用 hello-world
教程 https://www.jianshu.com/p/bf77cb5ce70b 需要注意的地方 jdk目录查找 jdk目录拷贝到tool目录下面(jdk可以拷贝,没有其他牵扯) https://w ...
- 安装hadoop2.9.2 jdk1.8 centos7
安装JDK1.8 查看JDK1.8的安装 https://www.cnblogs.com/TJ21/p/13208514.html 安装hadoop 上传hadoop 下载hadoop 地址h ...
- Typography convention
1 h1 Chapter title centered,number three in bold,used ##. 1.1 h2 The chapter is a section, and the s ...
- js省市二级联动实例
//动态创建省市二级联动<!DOCTYPE html><html lang="en"><head> <meta charset=" ...
- 学习 Spring Boot 知识看这一篇就够了
从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区.我的博客和我的公号内.粗略的统计了一下总共的文章加起来大概有六十多篇了,其 ...
- iframe 透明兼容,设置iframe透明背景的方法
从IE5.5+就支持iframe框架的背景透明.通过使用allowtransparency和background-color来设置iframe框架的透明效果,代码如下: <iframe src= ...