C++ 反射的實現

首先是要寫一個類,這個類主要有2個功能,註冊類和通過類名獲取類實例的功能

typedef map<string, void *> class_map;
typedef void* (*CreateObject)(void);
//聲明
class ClassFactory
{
public:
        void Register(const string &name, CreateObject method);
        void *GetClassByName(const string &name);
private:
    class_map m_ClassMap;
 }
//定義

void* ClassFactory::GetClassByName(const string &name)
{
    class_map::iterator it;
    it = m_ClassMap.find(name);
    if (it == m_ClassMap.end()) {
        return NULL;
    }
    else {
        return it->second;
    }
}

void  ClassFactory::Register(const string &name, CreateObject method)
{
    m_ClassMap.insert(make_pair(name,method()));
}

然後需要提供每個類註冊到class factory的宏定義

class RegisterFunction {
public:
    RegisterFunction(const string &name, CreateObject method) {
        ClassFactory::Instance().Register(name, method);
    }
};

#define CLASSCREATOBJECT(classname)                 \
    void *Create##classname(){                  \
        return reinpreter_cast<void *>(new classname) ;                     \
}       

#define REGISTERCLASS(classname)                    \
        RegisterFunction Register##classaname(#classname,(CreateObject) Create##classname)

最後在定義類的時候加上

CLASSCREATOBJECT(類名) //這個宏定義定義了一個create 類指針的方法

REGISTERCLASS(類名); // 根據上述的create類指針方法,將類對象register 到class factory中

最後的最後在使用的時候只需要,

GetClassByName(類索引) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章