C++ 本身并不直接支持反射,但是我們可以通過一些技術手段來模擬實現反射的功能。下面是一個簡單的示例,展示了如何在 C++ 中使用類型信息和函數指針來模擬反射:
#include<iostream>
#include<string>
#include <typeinfo>
#include <map>
// 基類,包含虛函數以啟用運行時類型信息 (RTTI)
class Base {
public:
virtual ~Base() {}
};
// 派生類 A
class DerivedA : public Base {
public:
static const std::string TYPE_NAME;
void doSomething() {
std::cout << "DerivedA: doSomething()"<< std::endl;
}
};
const std::string DerivedA::TYPE_NAME = "DerivedA";
// 派生類 B
class DerivedB : public Base {
public:
static const std::string TYPE_NAME;
void doSomethingElse() {
std::cout << "DerivedB: doSomethingElse()"<< std::endl;
}
};
const std::string DerivedB::TYPE_NAME = "DerivedB";
// 函數指針映射
std::map<std::string, Base*(*)()> classMap;
// 注冊函數
template<typename T>
void registerClass(const std::string& name) {
classMap[name] = []() -> Base* { return new T(); };
}
// 創建對象
Base* createObject(const std::string& name) {
auto it = classMap.find(name);
if (it != classMap.end()) {
return it->second();
}
return nullptr;
}
int main() {
// 注冊類
registerClass<DerivedA>("DerivedA");
registerClass<DerivedB>("DerivedB");
// 創建對象
Base* objA = createObject("DerivedA");
Base* objB = createObject("DerivedB");
// 檢查類型并調用相應的方法
if (DerivedA* derivedA = dynamic_cast<DerivedA*>(objA)) {
derivedA->doSomething();
}
if (DerivedB* derivedB = dynamic_cast<DerivedB*>(objB)) {
derivedB->doSomethingElse();
}
delete objA;
delete objB;
return 0;
}
這個示例中,我們定義了一個基類 Base
,兩個派生類 DerivedA
和 DerivedB
,以及一個全局的函數指針映射 classMap
。我們使用 registerClass
函數將類名與相應的構造函數關聯起來。然后,我們可以使用 createObject
函數根據類名創建對象。最后,我們使用 dynamic_cast
檢查對象的實際類型,并調用相應的方法。
需要注意的是,這種方法并不是真正的反射,而是一種模擬實現。C++ 中的反射功能有限,如果需要更強大的反射功能,可以考慮使用其他語言,如 C# 或 Java。