Зарегистрируйте тип класса с числовым идентификатором - PullRequest
1 голос
/ 08 февраля 2011

У меня есть класс сущностей , базовый класс компонентов и несколько базовых компонентов, полученных . Класс сущности содержит массив указателей базовых компонентов:

class CComponent
{
public:
  static unsigned GetType() { return -1; }; //Base identifier 
  //...
};

class CPoint : CComponent
{
  public:
    static unsigned GetType() { return 0; }; //Point identifier 
}

class CEntity
{
private:
  CComponent* aComponents[3];
public:
  // ... 
  //Getter by component ID here!
};

Я хотел бы знать, как я могу отобразить определенный компонент type вместе с его целочисленным идентификатором (для класса компонента CPoint это будет 0), чтобы я мог легко привести это к правильному типу, в моем классе Entity.

Пример : Предположим, я добавил компонент CPoint в массив компонентов сущности (в позиции 0, конечно), и я хочу получить его как CPoint (приведение типов), введя компонент целочисленный идентификатор (в данном случае 0). Я хочу как можно больше избегать огромных случаев «переключения»!

PS: я не хочу использовать множество виртуальных функций в моем базовом классе компонентов, которые соответствуют свойствам в моих производных. (Я не хочу иметь виртуальную функцию SetPos в моем базовом классе компонентов, пока она находится в классе CPoint);

PS # 2: Как прокомментировал etarion, я бы хотел что-то вроде этого:

dynamic_cast<get_type_for(0)*>(obj)

Конечно, это механизм, которого я хочу достичь, я не знаю, возможно ли это или нет.

1 Ответ

1 голос
/ 08 февраля 2011

Ну, я знаю несколько способов достичь того, чего вы хотите:

  • с gcc вы можете использовать нестандартную typeof(some_type) функцию, которая дает вам тип для динамического приведения вашего типа. Смотри здесь .
  • с C ++ 0x существует стандартный способ, имитирующий typeof: decltype(some_type)
  • вы можете использовать стандартный typeid, который дает вам type_info класс, который реализует operator==
  • boost :: variable - это еще один способ, упомянутый в одном из комментариев (я это хорошо знаю ...)

my2c

...