0

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

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();

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

4

2 回答 2

1

我知道没有任何自动方式。但是,如果我理解你,可以通过一点额外的努力来完成。

对于您的每个“基”类,添加一个引用自身的 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";

}

http://ideone.com/6ad08

于 2012-07-27T21:49:06.520 回答
0

为什么不在基类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.
 };
于 2012-07-27T21:05:52.167 回答