歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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

在使用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