C++ fubction函数和lambda函数

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\n");
}

int main()
{
    std::function<int(int, int)> call1 = fun1;
    int ans = call1(1, 2);
    printf("%d\n", 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",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函数使用

posted @ 2020-04-24 10:57  知道了呀~  阅读(626)  评论(0编辑  收藏  举报