在使用C++的时候,有时想通过输入的成员名字得到相应取值的功能,也就是想实现类似Java语言自备的反射功能。下面是我自己想到的一个比较方便的实现,仅作记录。
首先实现一个自动代码生成器:
将中间语言转化为C++语言,如下为中间语言可能的定义:
Class CInterLangTrans {
int32 i32Trans;
String sTrans;
}
编译之后产生的代码:
Class CInterLangTrans {
private:
int iMemberNum = 2;
int m_i32Trans;
string m_sTrans;
/*
* 如下为可能的类型定义:
* typedef void (* FuncPtr)(void*, const void*);
* Struct CTypeMemberInfo {
* int m_i32MemberType;
* char* m_szMemberName;
* FuncPtr m_funcPtr;
* };
*/
CTypeMemberInfo cTypeMemberInfo[3] = {
{INT32,"i32Trans",reinterpret_cast<FuncPtr>(pFunc4INT32)},
{STRING,"sTrans",reinterpret_cast<FuncPtr>(pFunc4STRING)},
{-1,0}
};
public:
void getAddressTable(const void* pTable[iMemberNum])
{
int i = 0;
pTable[i++] = &m_i32Trans;
pTable[i++] = &m_sTrans;
}
//由成员名字返回成员结构指针
//实现省略
CTypeMemberInfo* getTypeMemberInfo(string sMemberName);
}
//具体使用
//如下pInfo,pField取值步骤省略
CTypeMemberInfo* pInfo;
char* pField;
//如下模拟取得相应成员i32Trans的值
int pData;
(*pInfo->m_funcPtr)(&pData, pField);
好了,只是一个简单的想法,通过代码生成器完成大部分的工作,这样应该是可以支持类似JAVA的反射功能。
推荐阅读: