假设我有一些基础抽象类和三个不同的类,它们派生和实现了它的方法。有像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 {
};发布于 2020-02-04 22:55:24
您可以创建类似instanceof的方法,这些方法可以使用模板和std::is_base_of (1)或仅用于多态对象(2)的dynamic_cast来检测对象的类型。
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。我认为有了这些,你就能实现你所需要的。
发布于 2020-02-05 09:02:30
除了其他答案之外,您还可以生成一些C++代码,以满足您的需要。例如,考虑使用来自您的GPP工具的建筑自动化工具(例如Makefile),或者编写一个简单的AWK、诡计或Python脚本来做您想做的事情(或者在大口的启发下,在反之上编写一些临时的C++生成器),并根据您的需要生成一些C++代码。我的过时的GCC熔体在Linux上(动态地,在运行时)做到了这一点。
Qt有一个元对象协议就是这样做的。您可能从它的moc (这是开源的)生成C++代码中得到灵感。
还请看正在进行的(但-in 2020年2月-胚胎) RefPerSys项目。我们想利用这些想法,我们正在开始实施这些想法。请注意,在Linux dlopen上,可以在编译生成的和临时的C++代码所生成的共享对象上调用数千次在实践中。
https://stackoverflow.com/questions/60066535
复制相似问题