C 實現反射(三)

2021-07-29 09:13:05 字數 1579 閱讀 2736

新部落格鏈結

實現乙個模板類管理類名和類建構函式的對映關係,並提供構造物件的介面,每個基類需要初始化乙個這樣的管理物件。

提供乙個對應的 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,包括類的建構函式,那麼我們便能實現這一點。所以我們需要...