C++实现类属性映射


简化属性映射的代码,记录一下


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)





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值