[C++] 简单高效的 delegate 方法
2015年2月9日
使用 Objective-C 或者 Java 的都对其中的 delegate 方法印象很深,而在我们经常使用的 C++ 中虽然也有所谓的 Callback,但是似乎还挺麻烦的。有没有一个更好的实现方法呢?有的,国外的《Member Function Pointers and the Fastest Possible C++ Delegates》这篇文章就给了我们一个简单方便的实现库。
原理在作者的文章中已经讲得很详细了,我们这里简单讲一下使用方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> #include "FastDelegate.h" using namespace fastdelegate; // If you want to have a non-void return value, put it at the end. typedef FastDelegate2<int, int, int> DelegateA; class B { public: DelegateA delegate; int Func1(int a, int b) { delegate(a,b); return 1; } }; class A { public: B b; int c; A() { DelegateA delegate(this, &A::Func1); b.delegate = delegate; c = 4; }; int Func2() { return b.Func1(2, 3); }; int Func1(int a, int b) { printf("a=%d, b=%d, c=%d",a,b,c); return 1; }; }; int main(void) { A a; a.Func2(); return 0; } |
0、代码功能:
以上代码实现了这样一个简单的功能流程:
1)外部调用A::Func2函数;
2)A::Func2函数调用B::Func1函数;
3)B::Func1函数回调A::Func1函数。
1、代理类声明:
1)代理类型:
1 | typedef FastDelegate2<int, int, int> DelegateA; |
FastDelegate前两个参数对应A::Func1中的前两个参数,最后一个参数赌赢的A::Func1的返回值类型。
2)代理赋值:
通过 this 指针,A将自身传给B,同时通过&A::Func1指定了将类A中的哪个方法作为代理方法传给B。
1 2 3 4 5 | A() { DelegateA delegate(this, &A::Func1); b.delegate = delegate; }; |
2、代理调用:
在类B中delegate变量就已经相当于是A::Func1函数,可以和A::Func1函数一样调用:
1 | delegate(a,b); |
通过这样简单的几行代码就完成了一个基本的C++类间回调。我相信大家都很容易理解了。
参考文档:
FastDelegate库介绍和下载地址:
http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible