c++之旅:函数模板
函数模板
函数模板主要是泛型在函数的中的应用,通过泛型可以让函数处理各种各样的数据类型
简单的列子
#include <iostream>
using namespace std;
template <typename T> //定义泛型T
T add (T t1, T t2) {
return t1 + t2;
}
int main () {
cout << add(10.5, 0.8) << endl;
}
上面的例子中首先定义了泛型T,然后在add函数中使用了泛型,typename关键字也可以写成class。
明确指定类型
#include <iostream>
#include <string>
using namespace std;
template <typename T, typename E> //定义泛型T
E add (T t, E e) {
if (t > 1)
return e + "1";
else
return e + "1.5";
}
int main () {
cout << add<int, string>(10, "hello") << endl;
}
上面的代码中我们在调用add时显示的指定传入的类型
函数模板的重载
函数的模板的重载可函数的重载一个道理,都是通过函数名和函数参数列表来确定的
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T test(T t) {
return t;
}
template <typename T>
T test(T t, int n) {
return n;
}
int main () {
cout << test<int>(3) << endl;
cout << test<float>(3.5, 10) << endl;
}
第一个test(3)会调用第一个函数模板,而 test(3.5, 10)会调用第二函数模板
函数包装器
模板函数中不仅能接受普通类型作为参数,还能接受函数。当使用函数作为参数时,需要用到函数包装器
#include <iostream>
#include <functional>
using std::cout;
using std::endl;
using std::function;
template <typename V, typename F>
V add (V v1, V v2, F f) {
return f(v1, v2);
}
int main () {
function<int(int, int)> fun = [](int v1, int v2) {
return v1 + v2;
};
cout << add(1, 2, fun) << endl;
}
上面的代码中需引入functional库,并定义了一个函数。
function<int(int, int)> fun = [](int v1, int v2) {
return v1 + v2;
};
中括号中第一个int表示返回值类型,后面的小括号表示函数接受的参数。函数包装器的实质时函数指针。通过函数包装器我们可以在一个函数内部定义一个函数了。
函数包装器指向外部函数
#include <iostream>
#include <functional>
using namespace std;
void test(int i, int j) {
cout << i << j << endl;
}
int main () {
function<void(int, int)> fun = test;
fun(1,3);
}
引用包装器
要想在函数模板内部修改传入的值,需要传递变量的引用或者指针,一般情况下,我们会将变量的引用传递进去,这时将函数模板参数设置为引用或者使用引用包装器。
函数接受引用
#include <iostream>
#include <string>
using namespace std;
template <typename T>
void test(T t) {
t = 100;
}
int main () {
int a = 10;
test<int&>(a);
cout << a << endl;
}
使用引用包装器
引用包装器有些问题,尽量避免使用
#include <iostream>
#include <functional>
using namespace std;
template <typename T>
void test(T t) {
t += 100;
}
int main () {
int a = 10;
test(ref(a));
cout << a << endl;
}
上面的代码中去掉模板中的+号就会便宜错误
c++之旅:函数模板的更多相关文章
- c++函数模板作为类的成员函数,编译报错LNK2019的解决方法
为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...
- C++STL - 函数模板
模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...
- 使用getopt_long来解析参数的小函数模板
getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...
- C++函数重载和函数模板
1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...
- 零值初始化&字符串常数作为函数模板参数
1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...
- 让gcc支持成员函数模板的trick
让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 gcc 4.7.3 不支持成员 ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- Effective C++ -----条款45:运用成员函数模板接受所有兼容类型
请使用member function templates(成员函数模板)生成”可接受所有兼容类型“的函数. 如果你声明member templates 用于“泛化copy构造”或“泛化assignme ...
- c++ 左值右值 函数模板
1.先看一段代码,这就是一种函数模板的用法,但是红色的部分如果把a写成a++或者写成一个常量比如1,都是编译不过的,因为如果是a++的话,实际上首先是取得a的 值0,而0作为一个常量没有地址.写成1也 ...
随机推荐
- POJ2456 Aggressive cows(二分+贪心)
如果C(d)为满足全部牛之间的距离都不小于d. 先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d. #include<iostream> #include<cstdio> ...
- Unreal开发HTC Vive程序,开启VR编辑模式
新建项目模板有个VirtualReality 调试的时候,Play按钮下拉有个VR Preview 打开VR模式,在我现在用的4.15.0版本,VR编辑模式还是预览功能,可以在“编辑器偏好设置”-“试 ...
- JVM内存简析
1.程序计数器: 这是一块较小的内存空间,它的作用可以看作是当前线程所执行的字节码的行号指示器,线程私有. 2.Java虚拟机栈: 它是Java方法执行的内存模型,每一个方法被调用到执行完成的过程,就 ...
- JqGrid 获取所有数据
jqGrid使用本地数据时,当jqGrid配置的rowNum小于本地总数据量(records属性记录总数据,可以通过records获取到本地总数据量),调用getRowData方法获取到的只是显示的部 ...
- map重写比较器
结构体作为map的key或放入set中,需要重载<运算符,如下: typedef struct tagRoadKey { int m_i32Type; int m_i32Scale; bool ...
- 关于metaspolit中进行JAVA反序列化渗透RMI的原理分析
一.背景: 这里需要对java反序列化有点了解,在这里得推广下自己的博客嘛,虽然写的不好,广告还是要做的.原谅我: 1.java反序列化漏洞原理研习 2.java反序列化漏洞的检测 二.攻击手法简介 ...
- 【BZOJ1217】[HNOI2003]消防局的设立 树形DP
[BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...
- vue+node+mongoDB 火车票H5(六)---城市列表保存到MongoDB数据库并且启用node.js服务
把车站列表保存到数据库,并且从本地创建服务 node.js创建httpserver 1.搭建基于express的运行环境 全局安装express-gengerator cnpm install -g ...
- 如何在ubuntu上搭建服务器并且可以使用ftp上传
参考: 配置ftp: http://jingyan.baidu.com/article/67508eb4d6c4fd9ccb1ce470.html 配置ftp这个中把 新建 allowed_user ...
- Entity Framework 项目使用心得
在博客园很久了,一直只看不说,这是发布本人的第一个博客. 总结一下在项目中,EntityFramework使用的一下经验拿来和大家分享,希望对大家有用~ 1. 在Entity Fram ...