新部落格鏈結
實現乙個模板類管理類名和類建構函式的對映關係,並提供構造物件的介面,每個基類需要初始化乙個這樣的管理物件。
提供乙個對應的 static 模板函式,用來儲存和返回對應的管理物件。
使用模板函式和 new 操作符作為每個類的建構函式。
實現乙個簡單的 helper 模板類提供作為註冊的簡單封裝,並封裝巨集實現註冊。
封裝乙個巨集實現反射類的建立。
#ifndef __base_h__
#define __base_h__
#include #include #include // 使用模板,每個基類單獨生成乙個 classregister
// 好處是需要反射的類不需要去繼承 object 物件
// classregister 用來管理類名->類建構函式的對映,對外提供根據類名構造物件對函式
templateclass classregister
constructor_map_[class_name] = constructor;
}// 根據類名構造物件
classname* createobject(const std::string class_name) const
return (*(it->second))();
}};// 用來儲存每個基類的 classregister static 物件,用於全域性呼叫
template classregister& getregister()
// 每個類的建構函式,返回對應的base指標
template baseclassname* newobject()
// 為每個類反射提供乙個 helper,構造時就完成反射函式對註冊
templateclass classregisterhelper
~classregisterhelper(){}
};// 提供反射類的註冊巨集,使用時僅提供基類類名和派生類類名
#define registerclass(base_class_name, sub_class_name) \
static classregisterhelper\
sub_class_name##_register_helper( \
#sub_class_name, newobject);
// 建立物件的巨集
#define createobject(base_class_name, sub_class_name_as_string) \
getregister().createobject(sub_class_name_as_string)
#endif
下面是使用的示例:
#include #include #include #include "base3.h"
using namespace std;
class base
virtual void test()
virtual ~base() {}
};class a : public base
virtual void test()
c so 反射 C 實現反射機制
net下的很多技術都是基於反射機制來實現的,反射讓.net平台下的語言變得得心應手。最簡單的,比如列舉型別,我們我可以很容易的獲得乙個列舉變數的數值以及其名稱字串。可是,在c 中,列舉變數本質上和乙個整形變數沒有區別,我們很難獲取乙個列舉變數的名稱字串。其實在c 中,我們可以通過巨集來實現類似反射的...
c so 反射 c 實現反射機制
下午接了個阿里 面試,當時剛剛睡醒,感覺有點懵。大腦莫名當機狀態,很多問題沒有表述清楚,有乙個關於 c 如何實現反射機制的問題,感覺蠻有意思,當時雖然回答了用函式指標和工廠模式,但是表述並不當,細節也沒有想清楚。晚上抽空簡單實現了一發 file name reflector.cpp author x...
C 實現反射(二)
新部落格鏈結 找了一些資料,參考了 c 反射 開源中國 這篇,做了一些修改和簡化,成為了 version3.思路其實並不複雜,可以進行反推 反射是根據類名動態生成類,如果我們有乙個全域性的對映關係,可以從類名得到類的相關資訊 classinfo,包括類的建構函式,那麼我們便能實現這一點。所以我們需要...