用宏来实现:
// шаблон класса делегата MYGUI_TEMPLATE MYGUI_TEMPLATE_PARAMS class MYGUI_C_DELEGATE { public: typedef MYGUI_I_DELEGATE MYGUI_TEMPLATE_ARGS IDelegate; MYGUI_C_DELEGATE () : mDelegate(nullptr) { } MYGUI_C_DELEGATE (const MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& _event) { // забираем себе владение mDelegate = _event.mDelegate; const_cast< MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr; } ~MYGUI_C_DELEGATE () { clear(); } bool empty() const { return mDelegate == nullptr; } void clear() { if (mDelegate) { delete mDelegate; mDelegate = nullptr; } } MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS & operator=(IDelegate* _delegate) { delete mDelegate; mDelegate = _delegate; return *this; } MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS & operator=(const MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& _event) { // забираем себе владение delete mDelegate; mDelegate = _event.mDelegate; const_cast< MYGUI_C_DELEGATE MYGUI_TEMPLATE_ARGS& >(_event).mDelegate = nullptr; return *this; } void operator()( MYGUI_PARAMS ) { if (mDelegate == nullptr) return; mDelegate->invoke( MYGUI_ARGS ); } private: IDelegate * mDelegate; };
对于CDelegate1 而言:
其宏替换为:
// один параметр
#define MYGUI_SUFFIX 1
#define MYGUI_TEMPLATEtemplate
#define MYGUI_TEMPLATE_PARAMS <typename TP1>
#define MYGUI_TEMPLATE_ARGS <TP1>
#define MYGUI_T_TEMPLATE_PARAMS <typename T, typename TP1>
#define MYGUI_T_TEMPLATE_ARGS <T, TP1>
#define MYGUI_PARAMS TP1 p1
#define MYGUI_ARGS p1
#define MYGUI_TYPENAME typename
#include "MyGUI_DelegateImplement.h"
下面给出人肉宏替换便于分析:
基类:IDelegate
// базовый класс всех делегатов template <typename TP1> class IDelegate1 { public: virtual ~IDelegate1() { } virtual bool isType( const std::type_info& _type) = 0; virtual void invoke( TP1 p1 ) = 0; virtual bool compare( IDelegate1 <T, TP1> * _delegate) const = 0; virtual bool compare(IDelegateUnlink * _unlink) const { return false; } };
// шаблон класса делегата template <typename TP1> class CDelegate1 { public: typedef IDelegate1 <T, TP1> IDelegate; CDelegate1 () : mDelegate(nullptr) { } CDelegate1 (const CDelegate1 <T, TP1>& _event) { // забираем себе владение mDelegate = _event.mDelegate; const_cast< CDelegate1 <T, TP1>& >(_event).mDelegate = nullptr; } ~CDelegate1 () { clear(); } bool empty() const { return mDelegate == nullptr; } void clear() { if (mDelegate) { delete mDelegate; mDelegate = nullptr; } } CDelegate1 <T, TP1> & operator=(IDelegate* _delegate) { delete mDelegate; mDelegate = _delegate; return *this; } CDelegate1 <T, TP1> & operator=(const CDelegate1 <T, TP1>& _event) { // забираем себе владение delete mDelegate; mDelegate = _event.mDelegate; const_cast< CDelegate1 <T, TP1>& >(_event).mDelegate = nullptr; return *this; } void operator()( TP1 p1 ) { if (mDelegate == nullptr) return; mDelegate->invoke( p1 ); } private: IDelegate * mDelegate; };
CDelegate1 包含 IDelegate1 mDelegate;
IDelegate1 包含所代理的方法:
Delegate 进一步的印象:
我现在理解C的含义,C的意义应该是Container。