C++11 학습노트의 3lamda 표현식, std::function, std::bind

5866 단어 function
//lamda//first lamda [] {};
//second lamda []()//or no need () when paramater is null { std::cout << "second"<< std::endl; }();//last add(), express will call this lamda func
//3 with return type auto kkk = []() { return 1; }();
//4, set return type auto kkkk = [] (int i) -> bool { return (bool)i; }(5);
/5, lamda capture, [=], [=, &], [&], [this][] 포획하지 않음.../*[&] 인용 방식으로 포획 [=] 변수의 복사를 통해 포획 [=, &foo] 변수의 복사를 통해 포획하지만, foo 변수의 인용 포획 [bar] 복사를 통해 포획하고, 다른 [this] 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포획 포
 
 
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();

}

좋은 웹페이지 즐겨찾기