在使用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的反射功能。