Вопрос

Есть ли способ проверить, что такое 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();

Так что я не работаю с экземплярами.И я бы хотел сохранить текущую систему заблокированной.

Это было полезно?

Решение

Насколько мне известно, нет никакого автоматического способа.Однако, если я вас правильно понимаю, это может быть сделано с помощью небольших дополнительных усилий.

Для каждого из ваших "базовых" классов добавьте typedef, который ссылается сам на себя, и используйте его вместо этого в typeid().Обратите внимание, что подклассы могут переопределить его.Если они это сделают, то получат свой собственный идентификатор, а их дочерние элементы будут использовать их значение.

Обратите внимание, другое решение, если вы не хотите использовать 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

Другие советы

Почему бы не просто создать переменную в базовом классе ISomeInterFaceComponent, который не изменен любыми полученными классами (если вы конкретно не хотите, чтобы он был).Это не звучит так, как вы хотите, чтобы полиморфизм, поскольку вы хотите, чтобы потребовало битовое значение, чтобы быть <сильным> тем же независимо от типа производного типа класса, а не варьироваться в зависимости от типа.Если в будущем вам нужно переопределить, если для определенного производного типа вы все равно можете сделать это специально для этого класса.

В качестве альтернативы вы можете использовать виртуальную функцию в базовом классе, который возвращает 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.
 };
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top