C++11新特性(六)bind,function,lambda简单使用

来源:互联网 发布:javascript dom教程 编辑:程序博客网 时间:2024/06/05 03:04

#include <iostream>

#include <functional>

using namespace std;

class Node;

class Touch;

class Event;



#define  FUNCTIONCALL   function<void(Touch* touch, Event *event)>

#define CC_CAL_BACK2(selector, target, ...) bind(&selector, target, \

std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)


class Node

{

    

};


class Sprite :public Node

{

public:

    

    Sprite(){};

   virtual ~Sprite(){}

   void beginTouch(Touch* touch,Event *event, int num);

    

    

};



voidSprite::beginTouch(Touch* touch,Event *event, int num)

{

    cout <<"Sprite beginTouch evoked" << endl;

    

}



class NormalSprite

{

public:

    

    NormalSprite(){};

   virtual ~NormalSprite(){}

   void beginTouch(Touch* touch,Event *event);

    

};




voidNormalSprite::beginTouch(Touch* touch,Event *event)

{

    cout <<"NormalSprite beginTouch evoked" << endl;

    

}


class Event

{

    

};



class Touch

{

public:

    

    Touch();

   virtual ~Touch();

    

    

};



Touch::Touch()

{

    

}

Touch::~Touch()

{

    

}



class Dispatch

{

public:

    

    FUNCTIONCALL m_fun;

    

   void evokeEvent();

    

    

};


voidDispatch::evokeEvent()

{

    

   m_fun(new Touch, new Event);

    

}



int main()

{

   int datas[]{2,3,4,1,2};

   for_each(datas, datas + 5, [](int n){std::cout << n <<" ";});

   cout << std::endl;

    

   int sum = 90;

    

   auto f = [=](int a,int b){return ((a +b) + sum);};

   int result = f(1000,1000);

   std::cout << result <<std::endl;

   std::cout << sum <<std::endl;

    

    

   auto f2 = [&](int a,int b){ sum += 100;return ((a +b) + sum);};

   int result2 = f2(1,2);

   std::cout << result2 <<" "<< sum << std::endl;

    

    

    

    

   Sprite s;

    

   Dispatch *_dispatch = new Dispatch();

    _dispatch->m_fun =CC_CAL_BACK2(Sprite::beginTouch, s,10);

    _dispatch->evokeEvent();

    

    

    NormalSprite n;

    _dispatch->m_fun =CC_CAL_BACK2(NormalSprite::beginTouch, n);

    _dispatch->evokeEvent();

    cout <<"Everything is ok!" << endl;  

    return 0;

    输出结果如下:

   

2 3 4 1 2 
2090
90
193 190
Sprite beginTouch evoked
NormalSprite beginTouch evoked
Everything is ok!

Program ended with exit code: 0

    



}


0 0
原创粉丝点击