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的专栏