C++实现的委托机制(2)(三)

2014-11-24 12:43:47 · 作者: · 浏览: 2
& _type) = 0;
virtual void invoke( DELEGATE_PARAMS ) = 0;
virtual bool compare( MYGUI_I_DELEGATE DELEGATE_TEMPLATE_ARGS * _delegate) const = 0;
};
DELEGATE_TEMPLATE DELEGATE_TEMPLATE_PARAMS
class MYGUI_I_DELEGATE
{
public:
virtual ~MYGUI_I_DELEGATE() { }
virtual bool isType( const std::type_info& _type) = 0;
virtual void invoke( DELEGATE_PARAMS ) = 0;
virtual bool compare( MYGUI_I_DELEGATE DELEGATE_TEMPLATE_ARGS * _delegate) const = 0;
};

神奇吧,这里使用的可以说是宏实现的多态。

在这段代码编译完了之后,将所有宏都undefine掉,如

copy to clipboardprint #undef DELEGATE_TEMPLATE
#undef DELEGATE_TEMPLATE_PARAMS
#undef DELEGATE_TEMPLATE_ARGS
#undef MYGUI_I_DELEGATE
#undef DELEGATE_TEMPLATE
#undef DELEGATE_TEMPLATE_PARAMS
#undef DELEGATE_TEMPLATE_ARGS
#undef MYGUI_I_DELEGATE

再重新定义双参版本的,如

copy to clipboardprint #define DELEGATE_TEMPLATE template
#define DELEGATE_TEMPLATE_PARAMS
#define DELEGATE_TEMPLATE_ARGS TP1 p1, TP2 p2
#define MYGUI_I_DELEGATE IDelegate2
#define DELEGATE_TEMPLATE template
#define DELEGATE_TEMPLATE_PARAMS
#define DELEGATE_TEMPLATE_ARGS TP1 p1, TP2 p2
#define MYGUI_I_DELEGATE IDelegate2

那么编译出来的就是双参的版本了!

使用这种方法就可以将其他的如CStaticDelegate、CMethodDelegate和CMultiDelegate的各种版本都实现了,

而你要做的仅是重新define下那些宏就行了,够方便了吧。

下一篇文章将会介绍MyGUI实现的一些辅助类,如单委托和DelegateUnlink。并给出一个测试例子,测试该委托机制对C++各种函数的支持。

摘自:gouki04的专栏