C++11学习笔记之三lamda表达式,std::function, std::bind

//lamda
//first lamda
[]
{};ios

// second lamda
[]() //or no need () when paramater is null
{
std::cout << "second" << std::endl;
}();// last add(), express will call this lamda funcexpress

// 3 with return type
auto kkk = []()
{
return 1;
}();ide

// 4, set return type
auto kkkk = [] (int i) -> bool { return (bool)i; }(5);this

//5, lamda capture, [=], [=,&], [&], [this][] 不捕获...
/*[&] 以引用的方式捕获
[=] 经过变量的一个拷贝捕获
[=, &foo] 经过变量的拷贝捕获,可是用foo变量的引用捕获
[bar] 经过复制捕获,不要复制其余
[this] 捕获this指针对应成员
*/spa

 

 

function, bind等,上代码指针

#include <iostream>
#include <functional>
using namespace std;
typedef std::function<void()> fp;
typedef std::function<void(int)> fpi1;
void g_fun()
{
    std::cout << "global function bind" << std::endl;
}

class A
{
public:
    static void aFunStatic()
    {
        std::cout << "aFunStatic" << std::endl;
    }

    virtual void aFun()
    {
        std::cout << "aFun" << std::endl;
    }

    void aFunI1(int i)
    {
        std::cout << "aFunI1:"  << i << std::endl;
    }

};

class DerivedA
    :public A
{
public:
    virtual void aFun() override
    {
        std::cout << "aFun in DeriveA" << std::endl;
    }
};

class B
{
public:
    void bCallAFun()
    {
        if(callFun)
            callFun();
    }
    void bCallAFunStatic()
    {
        if(callFunStatic)
            callFunStatic();
    }

    void bCallAFunI1(int i)
    {
        if(callFunI1)
            callFunI1(i);
    }

    fp callFunStatic;
    fp callFun;
    fpi1 callFunI1;
};


void main()
{
    B b;
    A a;

    //bind to global function
    fp f = fp(&g_fun);
    f();

    //bind to class function
    //static
    b.callFunStatic = std::bind(&A::aFunStatic);
    b.bCallAFunStatic();

    //no static function without parameter
    b.callFun = std::bind(&A::aFun, &a);
    b.bCallAFun();

    //no static function with parameter
    b.callFunI1 = std::bind(&A::aFunI1, &a, std::placeholders::_1);
    b.bCallAFunI1(5);

    //about polymorphic
    DerivedA da;
    b.callFun = std::bind(&A::aFun, &da);
    b.bCallAFun();
}