比方说,我有一些基本的抽象类和三个不同的类来派生和实现它的方法。是否有一个像C#一样的 "类型 "对象?或者换句话说,我如何获得所有这些类的实例?
#ModuleBase.cpp
class ModuleBase {
};
#Module1.cpp
class Module1 : public virtual ModuleBase {
};
#Module2.cpp
class Module2 : public virtual ModuleBase {
};
#Module3.cpp
class Module3 : public virtual ModuleBase {
};
你可以创建 instanceof
样的方法,可以使用模板和 std::is_base_of
(1)或 dynamic_cast
只适用于多态对象(2).
1 现场样品
template<typename Base, typename T> inline bool instanceof(const T) {
return is_base_of<Base, T>::value;
}
int main() {
Module1 module;
if(instanceof<Module1>(module)) {
cout << "Module1" << endl;
}
if(instanceof<Module2>(module)) {
cout << "Module2" << endl;
}
if(instanceof<ModuleBase>(module)) {
cout << "ModuleBase" << endl;
}
}
2 现场样品
class ModuleBase { public: virtual ~ModuleBase(){} };
template<typename T> inline bool instanceof(const ModuleBase * base) {
return dynamic_cast<const T*>(base);
}
int main() {
Module1* module = new Module1();
if(instanceof<Module1>(module)) {
cout << "Module1" << endl;
}
if(instanceof<Module2>(module)) {
cout << "Module2" << endl;
}
if(instanceof<ModuleBase>(module)) {
cout << "ModuleBase" << endl;
}
}
对象的类型都是 ModuleBase
和 Module1
. 我想有了这些你就可以达到你所需要的目的。
除了其他的答案,你可以 产生 一些C++代码做你想要的事情。例如,可以考虑使用 GPP 从你 建立自动化 工具(如 Makefile
)或编写一个简单的 AWK, 诡计或 蟒蛇 脚本来做你想要的事情(或者是上面的一些临时的C++生成器)。ANTLR灵感来自于 SWIG),并根据你的需要生成一些C++代码。我的过时的 GCC MELT 在Linux上做到了(动态地,在运行时)。
Qt 拥有 元对象 协议正是这样做的。你可以从它的 moc
(这是开源的)生成C++代码。
也可以看看正在进行中的(但在2020年2月的胚胎)。RefPerSys 项目。我们希望使用这些想法,并开始实施它们。请注意,在Linux上 dlopen
千呼万唤始出来 实际上在生成的和临时的C++代码编译产生的共享对象上。