Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 递归检查超类类型\u信息_C++_Superclass_Typeid_Typeinfo - Fatal编程技术网

C++ 递归检查超类类型\u信息

C++ 递归检查超类类型\u信息,c++,superclass,typeid,typeinfo,C++,Superclass,Typeid,Typeinfo,有没有办法检查超类的类型信息是什么? 在我的系统中,对象由一组位标识。由类型\信息哈希代码标识。我希望其中一些类型能够启用多态性,因为我的系统认为它们处于相同的位之下。type_info为每个类类型创建一个唯一的hashcode。相反,我希望派生类采用其超类的位集,如下所示: Component > ISomeInterfaceComponent -> bit = 00001 | \ ComponentContextA -&

有没有办法检查超类的类型信息是什么? 在我的系统中,对象由一组位标识。由类型\信息哈希代码标识。我希望其中一些类型能够启用多态性,因为我的系统认为它们处于相同的位之下。type_info为每个类类型创建一个唯一的hashcode。相反,我希望派生类采用其超类的位集,如下所示:

Component > ISomeInterfaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextB  -> bit = ISomeInterFaceComponent bit
              |
              \  ComponentContextC  -> bit = ISomeInterFaceComponent bit
这应该将包含组件的对象添加到一个系统中进行处理

目前情况如下:

Component > ISomeInterFaceComponent -> bit = 00001
              |
               \ ComponentContextA  -> bit = 00010
              |
              \  ComponentContextB  -> bit = 00100
              |
              \  ComponentContextC  -> bit = 01000
这要求我为所有组件创建不同的系统

如果有人能给我指点我如何才能做到这一点,那就太好了

编辑: 为防止混淆,为类型设置位,如下所示: ComponentTypeManager::getBit()


所以我不使用实例。而且我希望保持当前系统处于锁定状态。

为什么不在基类
ISomeInterFaceComponent
中创建一个不被任何派生类修改的变量(除非您特别希望)。听起来您并不希望多态性,因为您希望位值是相同的,而不管派生类类型如何,而不是根据类型而变化。如果将来需要为某个派生类型重写If,仍然可以专门为该类执行此操作

或者,您可以在基类中使用一个虚拟函数,该函数返回一个int(位值-或它实际上是什么类型),并且在希望与基类具有相同位值的派生类中不重写它

比如说

 class ISomeInterFaceComponent {
      virtual int GetBit() { return 1;};  // return bit value
 };


 class ComponentContextA : public ISomeInterFaceComponent {
      // Do not override GetBit() - let the base class function get called.
 };

我意识到没有任何自动的方式。不过,如果我理解你的意思,那么只需稍加努力就可以做到

对于每个“基类”,添加一个引用自身的typedef,并在
typeid()
中使用它。注意,子类可以选择覆盖它。如果他们这样做,那么他们将获得自己的ID,他们的孩子将使用他们的价值观

请注意,如果您根本不想使用
typeid()
,另一种解决方案是在基类上有一个静态成员(或成员函数),该成员为基类返回正确的值,然后在getBit()函数中直接调用它

#include <iostream>
#include <iomanip>
#include <typeinfo>

struct Base1 
{
   typedef Base1 Base;

};

struct Base2
{
   typedef Base2 Base;
};

struct Derived1A : public Base1 { };   
struct Derived1B : public Base1 { };    
struct Derived2A : public Base2 { };    
struct Derived2B : public Base2 { };

template <typename T>
std::size_t getBit()
{
   // Do whatever you normally do here, but use T::Base instead of T
   return std::hash<std::string>()(typeid(typename T::Base).name());
}

int main()
{ 
   std::cout << std::boolalpha << getBit<Derived1A>() << " == " << getBit<Derived1B>() << " " << (getBit<Derived1A>() == getBit<Derived1B>()) << "\n";

   std::cout << std::boolalpha << getBit<Derived2A>() << " == " << getBit<Derived2B>() << " " <<(getBit<Derived2A>() == getBit<Derived2B>()) << "\n";

}
#包括
#包括
#包括
结构Base1
{
typedef Base 1 Base;
};
结构Base2
{
typedef Base 2 Base;
};
struct-Derived1A:public-Base1{};
struct-Derived1B:public-Base1{};
struct-Derived2A:public-Base2{};
struct-Derived2B:public-Base2{};
模板
std::size\u t getBit()
{
//执行通常在这里执行的操作,但使用T::Base而不是T
返回std::hash();
}
int main()
{ 

std::cout,因为类型是由它们的实际类名而不是实例定义的。获取位类型如下:ComponentTypeManager::getBit();在这种情况下,我不使用实例。我直接使用类本身。@Sidar-我明白了。在这种情况下,我不知道。对不起。我写到“我可以只使用type\u信息来做这件事吗?”?C++11提供了一个is_base_模板来做同样的事情。但是在我的情况下,创建几十个if/else是不实际的。我真的认为我需要重新设计它。谢谢你的回复。但是我不认为这是可行的,因为所有的东西都是从一个组件类派生的,它在一个基本级别上支持多态性。我想我必须重新设计它噢。@Sidar:好吧,它应该仍然有效。没有什么能阻止Base1和Base2拥有一个通用的超类型。