用宏来实现:
// шаблон класса делегата
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; }
};
即CDelegate1 类为:
// шаблон класса делегата
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。