C#属性的功能实际就是实现通过对成员变量的访问,间接调用背后的get,set方法,在C++中可以通过重载操作符实现。
代码:
/***********************************************************************
// LiFei
***********************************************************************/
#ifndef _PROPERTY_H
#define _PROPERTY_H
template <typename T, typename TContainer>
class CProperty
{
public:
typedef void (TContainer::*NotifyFunction)();
typedef T ValueType;
typedef TContainer ContainerType;
public:
CProperty() : m_value(T()), m_pFunc(0), m_pContainer(0) {}
explicit CProperty(const T& value) : m_value(value), m_pFunc(0), m_pContainer(0) {}
explicit CProperty(const T& value, NotifyFunction pFunc) : m_value(value), m_pFunc(pFunc), m_pContainer(0) {}
explicit CProperty(const T& value, NotifyFunction pFunc, TContainer* pContainer) : m_value(value), m_pFunc(pFunc), m_pContainer(pContainer) {}
T& operator = (const T& value)
{
m_value = value;
if (m_pContainer && m_pFunc)
(m_pContainer->*m_pFunc)();
return m_value;
}
CProperty<T, TContainer>& operator = (const CProperty<T, TContainer>& prop)
{
m_value = prop.m_value;
if (m_pContainer && m_pFunc)
(m_pContainer->*m_pFunc)();
return *this;
}
operator T&() { return m_value; }
operator T*() throw() { return &m_value; }
T& Value() { return m_value; }
public:
void SetNotifyer(TContainer* pContainer, NotifyFunction pFunc)
{
m_pContainer = pContainer;
m_pFunc = pFunc;
}
private:
T m_value;
NotifyFunction m_pFunc;
TContainer* m_pContainer;
};
//
#endif