C++11:lambda表达式、bind函数、function类型

1. lambda表达式

#include <iostream>
#include <string>
using namespace std;


//lambda表达式:表示一个可调用单元,理解为一个未命名的内联函数。
//[capture list] (parameter list) -> return type { function body }

void lambda_test()
{
    //可以忽略参数列表和返回类型,但必须包含:捕获列表和函数体。
    //如果忽略参数列表时,表示参数列表为空。
    //如果忽略返回类型,lambda根据函数体中的代码推断出返回类型。
    //  如果函数体只有一个return语句,则推断返回类型。否则返回类型为void
    //
    auto f = []{return 42; };

    cout << f() << endl;


    //lambda只有在捕获列表中捕获它所在函数中的局部变量,才能在函数体中使用该变量
    //[&,list]引用捕获
    //[=,list]值捕获。
    int sz = 13;
    int sx = 12;
    auto func = [sz,sx](int a)/*->bool*/{
        //if (sz > a){
        //  return true;
        //}
        //return false;
        return sz + sx + a;
    };

    cout << func(31) << endl;
}

对于那种只在一两个地方使用的简单操作,lambda表达式是最有用的。
如果在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式。
如果一个操作需要很多语句才能完成,通常使用函数更好。

举例:
可以用在简单的回调函数中。

如果lambda的捕获列表为空,通常可以用函数来代替它。
但是,对于捕获局部变量的lambda,就不该使用函数代替了。而是应该使用bind函数。

2. 标准库bind函数

接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

#include <functional>  //std::bind

bind VS lambda 使用示例:


#include <functional>
#include <iostream>
using std::cout;
using std::endl;


int add(int a, int b)
{
    return a + b;
}

void std_bind_test()
{
    int x = 13;
    //int b = 5;
    //cout << std::bind(add, x, 5)() << endl;  //使用bind,使用局部变量,减少add函数需要的参数。

    cout << std::bind(add, std::placeholders::_1,x)(5) << endl;  
    //使用bind,使用局部变量,减少add函数需要的参数。
    //占位符在命名空间std::placeholders中。
    cout << [x](int a){return x + a; }(3) << endl;  //使用lambda,捕获局部变量

}

3. function类型

标准库function类型,定义在#include <functional>


#include <functional>
#include <iostream>
using std::cout;
using std::endl;


int add(int a, int b)
{
    return a + b;
}

int mul(int a, int b)
{
    return a*b;
}

void std_bind_test()
{
    function<int(int, int)> f;  //定义一个函数对象。
    f = add;
    cout << f(3, 5) << endl;

    f = mul;
    cout << f(3, 5) << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值