functiona函数介绍
std::function是一个函数包装器模板,来自fubctional库。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。
包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。
一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作
并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。
当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。
头文件包含在#include<functional>里面
functiona函数使用
和vector的使用类似,std::function<函数返回类型(参数1类型,参数2类型,.......)> 包装后的函数名称
#include<functional> int fun1(int n, int m) { return n + m; } void fun2(int n) { printf("fun2 "); } int main() { std::function<int(int, int)> call1 = fun1; int ans = call1(1, 2); printf("%d ", ans); std::function<void(int)> call2 = fun2; call2(3); return 0; }
lambda函数
上面用function去封装普通函数可能还看不出来使用function函数的意义,现在在介绍一下封装lambda表达式,更好理解function函数
C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式),还有一个名字式匿名函数,它有四部组成,分别是:
lambda表达式 拉曼达表达式 匿名函数
[ caputrue ] ( params ) opt -> ret { body; };
[ 外部变量捕获列表 ] ( 参数表 ) 特殊操作符 -> 返回值类型 { 函数体; };
捕获列表:lambda表达式的捕获列表精细控制了lambda表达式能够访问的外部变量,以及如何访问这些变量。
1) []不捕获任何变量。
2) [&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获)。
3) [=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
4) [=, &foo]按值捕获外部作用域中所有变量,并按引用捕获foo变量。
5) [bar]按值捕获bar变量,同时不捕获其他变量。
6) [this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。
如果已经使用了&或者 = ,就默认含有此选项。
捕获this的目的是可以在lamda中使用当前类的成员函数和成员变量。
1).capture是捕获列表;
2).params是参数表;(选填)
3).opt是函数选项;可以填mutable,exception,attribute(选填)
mutable说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法。
exception说明lambda表达式是否抛出异常以及何种异常。
attribute用来声明属性。
4).ret是返回值类型。(选填)
int n = 5; //匿名函数 function call=[n/*外部变量捕获列表*/](/*参数列表*/int a,int b) -> int/*返回值类型*/ { //函数体 printf("%d ",n+a+b); return 2; };
lambda函数是通常和function函数一起使用,function函数定义一个封装函数的变量名称,lambda实现函数的封装,这样配合使用可以减少函数指针的使用以及资源的消耗,达到将一个函数当成一个变量去传参、储存,同时还能实现函数功能的效果
#include<functional> #include<iostream> #include<vector> using namespace std; typedef function< void() > fun; vector<fun>p; void GetSum(int x, int y) { cout << x + y << endl; } void add(fun fun1) { p.push_back(fun1); } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { int x, y; cin >> x >> y; add([x, y]() {GetSum(x, y); }); } for (int i = 0; i < n; i++) { p[i](); } system("pause"); return 0; }
functiona函数使用