简化属性映射的代码,记录一下
class CMapBase
{
protected:
CMapBase() {};
public:
virtual ~CMapBase() {};
public:
static std::map<tstring, std::vector<tstring>> stmapParam; //类型名称对应的参数名vector;
static std::map<tstring, int> stmapMaper; //类型名称+参数名称对应的值的偏移量;
static C_CriticalSection stcrsLock;
virtual tstring GetValue(tstring name)
{
return _T("");
};
virtual tstring GetName()
{
return _T("");
};
virtual std::vector<tstring> GetParams()
{
return GetParamName(_T("CMapBase Undefined!!"));
};
std::vector<tstring> GetParamName(tstring name)
{
stcrsLock.Lock();
std::vector<tstring> st = stmapParam[name];
stcrsLock.UnLock();
return st;
}
void SetParamName(tstring name, std::vector<tstring> param)
{
stcrsLock.Lock();
stmapParam[name] = param;
stcrsLock.UnLock();
}
int GetParamOffset(tstring keyName)
{
stcrsLock.Lock();
int iRet = stmapMaper[keyName];
stcrsLock.UnLock();
return iRet;
}
void SetParamOffset(tstring keyName, int n)
{
stcrsLock.Lock();
stmapMaper[keyName] = n;
stcrsLock.UnLock();
}
};
//映射宏 类成员属性类型已经假定为tstring,可以修改为万能类型或者其它类型
//
#define DECLARE_MAP_PARAM(cls,name) tstring m##name;
#define INIT_MAP_VALUE(cls,name) SetParamOffset(tstring(#cls)+tstring(#name),(char*)(&this->m##name)-((char*)this));\
vecParam.push_back(tstring(#name));
#define START_MAP_CLASS(cls,param)\
struct cls:public CMapBase\
{\
param(cls,DECLARE_MAP_PARAM);\
cls()\
{\
tstring str;\
std::vector<tstring> vecParam;\
param(cls,INIT_MAP_VALUE);\
SetParamName(#cls,vecParam);\
}\
virtual tstring GetName()\
{\
return _T(#cls);\
}\
virtual std::vector<tstring> GetParams() \
{\
std::vector<tstring> temp=GetParamName(_T(#cls));\
return temp;\
}\
virtual tstring GetValue(tstring name)\
{\
tstring keyName=_T(#cls)+name;\
int offset=GetParamOffset(keyName);\
if(offset==0)\
{\
return _T("");\
}\
return *(tstring*)(offset+(char*)this);\
}
#define END_MAP_CLASS(cls)\
};
用法:
#define MobilePhoneInfoParams(cls,x)\
x(cls,Number);\
x(cls,Money);\
x(cls,PayMoney);\
x(cls,Message);\
x(cls,DateTime);\
x(cls,MacName);\
x(cls,MacPosition)\
START_MAP_CLASS(MobilePhoneInfo, MobilePhoneInfoParams)
void Reset()
{
mNumber = mMoney = mPayMoney = mMessage = mDateTime = mMacPosition = mMacName = _T("");
}
END_MAP_CLASS(MobilePhoneInfo)