首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查派生类的类型?(C++调查)

如何检查派生类的类型?(C++调查)
EN

Stack Overflow用户
提问于 2020-02-04 22:34:46
回答 2查看 682关注 0票数 1

假设我有一些基础抽象类和三个不同的类,它们派生和实现了它的方法。有像C#那样的“类型”对象吗?换句话说,我如何获得所有这些类的实例?

代码语言:javascript
复制
#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 {

};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-04 22:55:24

您可以创建类似instanceof的方法,这些方法可以使用模板和std::is_base_of (1)或仅用于多态对象(2)的dynamic_cast来检测对象的类型。

1 活样品

代码语言:javascript
复制
template<typename Base, typename T> inline bool instanceof(const T) {
   return is_base_of<Base, T>::value;
}
代码语言:javascript
复制
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 活样品

代码语言:javascript
复制
class ModuleBase { public: virtual ~ModuleBase(){} };

template<typename T> inline bool instanceof(const ModuleBase * base) {
   return dynamic_cast<const T*>(base);
}
代码语言:javascript
复制
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;
   }
}

对象的类型都是ModuleBaseModule1。我认为有了这些,你就能实现你所需要的。

票数 3
EN

Stack Overflow用户

发布于 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++代码所生成的共享对象上调用数千次在实践中

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60066535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档