模版函数指针,C++委托的实现

原文链接:http://www.cppblog.com/tonykee/archive/2008/09/29/63034.html


今天写引擎的时候,很想加入一些回调函数,以前一直没时间整理这块,这次一定要下决心好好整整代码,纯粹用多态,很多类非要加个帽子,类之间的关系也显的很单一,有的情况需要用到委托的回调机制,这是个很好的东西,在C#里面是原生支持的,C++里面本来函数指针是个不错的选择,可到了对象里面,成员函数指针还有那么好用吗?这原本是另C++程序员非常失望和无赖的,难道一说到成员函数指针就真的那么不好用,甚至要沦为被唾弃的命运?并非入此,别忘了,C++里面还有很强的利器,C#和Java后天才具备的特性可是C++先天就具备的哦,那就是范型,C++里面的用的是模版,而且如果把 模版和成员函数指针结合在一起,那就威力无比了,那应该叫做就是“成员模版函数指针”,C++的教科书上有这个名词吗?我查了查,好像是没有,而且网上很多资料竟然说这个不能实现之类的话,我都怀疑那些如此断言的人是否太不负责仁了,误导人啊。

当然指想成员函数的指针,这里面的确有段C++设计的问题,C++的成员函数地址通过对象外去引用不能直接通过“&对象.方法”的方式来引用,这个在C++标准里面是没有的,很多人到这里就绝望了,可间接引用呢?而且用很优雅的方式来引用呢?

好了,我也不绕圈子了,给出我的代码,一个简单的 “成员模版函数指针” 的实现,看看C++是如何优雅的实现委托的,真的非常非常的优雅,由于完全自己摸索出来的,真是感慨万千啊。

#include "stdafx.h"

#include <iostream>

using namespace std;

template<typename T>
class A
{
private:
   typedef int (T::*delegateFun)(int);
   T * _This;
   delegateFun _deleGate;

public:   

 //This被代理的对象, delegateFun被代理的方法
 
 A(T * This, int (T::*delegateFun)(int))
 { 
       _This = This;
       _deleGate = delegateFun;
 }

    //c被代理的参数
 int execue(int c)
 {
      return (_This->*_deleGate)(c);
 }

};


class B
{
public:
 int FunA(int a) {return a + 10;}
 int FunB(int a) {return a - 10;}
 B()
 {

 }
};

int _tmain(int argc, _TCHAR* argv[])
{


 B *objB = new B();

 A<B>  delegateObj1(objB, (&B::FunA));
 A<B>  delegateObj2(objB, (&B::FunB));


 cout << delegateObj1.execue(10) <<endl;
 cout << delegateObj2.execue(20) <<endl;

 return 0;

}

 

 

 

看完了感觉如何?以后想要设计一个callback回调函数是否明朗了许多?
再也不需要强行搞个static约束方法,那么恶心的东西了吧


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 委托通常是通过函数指针函数对象来实现的。以下是使用函数指针实现委托的示例代码: ```c++ #include <iostream> // 声明一个委托类型 typedef int (*Delegate)(int, int); // 一个加法函数 int add(int x, int y) { return x + y; } // 一个减法函数 int sub(int x, int y) { return x - y; } // 接收一个委托作为参数 int doMath(int x, int y, Delegate delegate) { return delegate(x, y); } int main() { // 使用加法函数进行计算 int result = doMath(10, 5, add); std::cout << "10 + 5 = " << result << std::endl; // 使用减法函数进行计算 result = doMath(10, 5, sub); std::cout << "10 - 5 = " << result << std::endl; return 0; } ``` 在上面的示例,我们通过 `typedef` 关键字定义了一个委托类型 `Delegate`,它是一个函数指针类型,接收两个 `int` 类型的参数并返回一个 `int` 类型的值。然后我们定义了两个函数 `add` 和 `sub`,它们分别实现加法和减法运算。最后,我们定义了一个 `doMath` 函数,它接收三个参数:两个整数和一个委托类型的函数指针。在 `doMath` 函数,我们通过调用委托来执行相应的数学运算。 除了使用函数指针,还可以使用函数对象来实现委托。以下是使用函数对象实现委托的示例代码: ```c++ #include <iostream> // 声明一个委托类型 template <typename T> class Delegate { public: virtual T operator()(T, T) = 0; }; // 一个加法函数对象 template <typename T> class AddDelegate : public Delegate<T> { public: T operator()(T x, T y) override { return x + y; } }; // 一个减法函数对象 template <typename T> class SubDelegate : public Delegate<T> { public: T operator()(T x, T y) override { return x - y; } }; // 接收一个委托作为参数 template <typename T> T doMath(T x, T y, Delegate<T>& delegate) { return delegate(x, y); } int main() { // 使用加法函数对象进行计算 AddDelegate<int> addDelegate; int result = doMath(10, 5, addDelegate); std::cout << "10 + 5 = " << result << std::endl; // 使用减法函数对象进行计算 SubDelegate<int> subDelegate; result = doMath(10, 5, subDelegate); std::cout << "10 - 5 = " << result << std::endl; return 0; } ``` 在上面的示例,我们定义了一个委托类型 `Delegate`,它是一个函数对象类型,接收两个模板类型的参数并返回一个模板类型的值。然后我们定义了两个函数对象 `AddDelegate` 和 `SubDelegate`,它们分别实现加法和减法运算。最后,我们定义了一个 `doMath` 函数,它接收三个参数:两个模板类型的值和一个委托类型的函数对象的引用。在 `doMath` 函数,我们通过调用委托来执行相应的数学运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值