歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++實現類似Java反射的基本功能

C++實現類似Java反射的基本功能

日期:2017/3/1 9:51:50   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved