C++ 委托 fastdelegate使用,实现类函数回调绑定

搜索下载文件: fastdelegate.h

下载地址:
[url]http://code.google.com/p/code-adintr-com/source/browse/trunk/mylib/aslib/utility/FastDelegate.h?r=4[/url]



#include <stdio.h>
#include "fastdelegate.h"

///
//被委托绑定的类成员函数
class Calculator
{
public:
int Add(int nA, int nB)
{
return nA + nB;
}

int Sub(int nA, int nB)
{
return nA - nB;
}

int Multi(int nA, int nB)
{
return nA * nB;
}
};
/
//定义函数指针
typedef fastdelegate::FastDelegate2<int, int, int> AddFunc;
typedef fastdelegate::FastDelegate2<int, int, int> SubFunc;
typedef fastdelegate::FastDelegate2<int, int, int> MultiFunc;

//实现绑定到处理类
class CalcHander
{
public:

template <class X, class Y, class Param1, class Param2, class RetType>
void bind_add(Y* x, RetType (X::*func)(Param1 p1, Param2 p2))
{
pAddFunc = fastdelegate::MakeDelegate(x, func);
}

template <class X, class Y, class Param1, class Param2, class RetType>
void bind_sub(Y* x, RetType (X::*func)(Param1 p1, Param2 p2))
{
pSubFunc = fastdelegate::MakeDelegate(x, func);
}

template <class X, class Y, class Param1, class Param2, class RetType>
void bind_Multi(Y* x, RetType (X::*func)(Param1 p1, Param2 p2))
{
pMultiFunc = fastdelegate::MakeDelegate(x, func);
}

public:

void Init(Calculator *pCalculator)
{
bind_add(pCalculator, &Calculator::Add);
bind_sub(pCalculator, &Calculator::Sub);
bind_Multi(pCalculator, &Calculator::Multi);
}


void ExecuteAdd(int nA, int nB)
{
int nSum = pAddFunc(nA, nB);
printf("Sum=%d\n", nSum);
}

void ExecuteSub(int nA, int nB)
{
int nSub = pSubFunc(nA, nB);
printf("Sub=%d\n", nSub);
}

void ExecuteMulti(int nA, int nB)
{
int nMulti = pMultiFunc(nA, nB);
printf("Multi=%d\n", nMulti);
}

private:
AddFunc pAddFunc;
SubFunc pSubFunc;
MultiFunc pMultiFunc;
};


int main(int argc, char* argv[])
{
Calculator calculator; //被绑定对象声明
CalcHander calcHander; //主动绑定的对象声明
calcHander.Init(&calculator); //函数绑定
//执行函数,调用绑定函数
calcHander.ExecuteAdd(200, 100); //300 相当于调用 calculator.Add(200, 100);
calcHander.ExecuteSub(300, 100); //200 相当于调用 calculator.Sub(300, 100);
calcHander.ExecuteMulti(50, 20); //1000 相当于调用 calculator.Multi(50, 20);

return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以使用函数指针或者std::function来实现调用回调函数。具体实现方式如下: 1. 函数指针 定义一个函数指针型,该函数指针型指向回调函数型,例如: ``` typedef void (*CallbackFunc)(int); ``` 这里定义了一个名为CallbackFunc的函数指针型,该函数指针型指向一个参数型为int,返回型为void的回调函数。 在回调函数所在的中定义一个成员函数,该成员函数接受一个函数指针作为参数,并在需要调用回调函数使用函数指针,例如: ``` class CallbackClass { public: void setCallback(CallbackFunc func) { m_callbackFunc = func; } void doSomething() { if (m_callbackFunc) { m_callbackFunc(123); } } private: CallbackFunc m_callbackFunc; }; ``` 在其他中定义一个成员函数,该成员函数作为回调函数,并将其地址传递给CallbackClass的setCallback函数,例如: ``` class OtherClass { public: void callbackFunc(int value) { // do something with value } void doSomethingWithCallback() { CallbackClass callbackObj; callbackObj.setCallback(callbackFunc); callbackObj.doSomething(); } }; ``` 在上面的代码中,OtherClass中的callbackFunc函数就是回调函数,该函数将被CallbackClass调用。 2. std::function std::function是C++11标准中引入的函数对象,可以用来包装任何可调用对象,包括函数指针、成员函数指针、Lambda表达式等。使用std::function可以更加灵活地实现调用回调函数。 定义一个std::function型的变量,该变量的型与回调函数型一致,例如: ``` std::function<void(int)> callbackFunc; ``` 在回调函数所在的中定义一个成员函数,该成员函数接受一个std::function型的参数,并在需要调用回调函数使用该参数,例如: ``` class CallbackClass { public: void setCallback(std::function<void(int)> func) { m_callbackFunc = func; } void doSomething() { if (m_callbackFunc) { m_callbackFunc(123); } } private: std::function<void(int)> m_callbackFunc; }; ``` 在其他中定义一个成员函数,该成员函数作为回调函数,并将其包装成std::function型的变量,然后将该变量传递给CallbackClass的setCallback函数,例如: ``` class OtherClass { public: void callbackFunc(int value) { // do something with value } void doSomethingWithCallback() { CallbackClass callbackObj; callbackObj.setCallback(std::bind(&OtherClass::callbackFunc, this, std::placeholders::_1)); callbackObj.doSomething(); } }; ``` 在上面的代码中,std::bind函数将OtherClass的callbackFunc函数绑定到当前对象上,并将其包装成std::function型的变量,然后将该变量传递给CallbackClass的setCallback函数。在回调函数中,std::placeholders::_1表示回调函数的第一个参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值