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

1. lambda表达式

#include 
#include 
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   //std::bind

bind VS lambda 使用示例:


#include 
#include 
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


#include 
#include 
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;
}

你可能感兴趣的:(C++)