В C ++ возникла интересная проблема, но она была больше связана с архитектурой.
Существует множество (10, 20, 40 и т. Д.) Классов, описывающих некоторые характеристики (смешанные классы), например:
struct Base { virtual ~Base() {} };
struct A : virtual public Base { int size; };
struct B : virtual public Base { float x, y; };
struct C : virtual public Base { bool some_bool_state; };
struct D : virtual public Base { string str; }
// ....
Основной модуль объявляет и экспортирует функцию (для простоты просто объявления функций без классов):
// .h file
void operate(Base *pBase);
// .cpp file
void operate(Base *pBase)
{
// ....
}
Любой другой модуль может иметь такой код:
#include "mixing.h"
#include "primary.h"
class obj1_t : public A, public C, public D {};
class obj2_t : public B, public D {};
// ...
void Pass()
{
obj1_t obj1;
obj2_t obj2;
operate(&obj1);
operate(&obj2);
}
Вопрос в том, как узнать, каков реальный тип данного объекта в operate()
без использования dynamic_cast
и какой-либо информации о типах в классах (константы и т. Д.)?Функция operate()
используется с большим массивом объектов за небольшие промежутки времени, и dynamic_cast
слишком медленный для нее, и я не хочу включать константы (enum obj_type { ... }
), потому что это не OOP-способ.
// module operate.cpp
void some_operate(Base *pBase)
{
processA(pBase);
processB(pBase);
}
void processA(A *pA)
{
}
void processB(B *pB)
{
}
Я не могу напрямую передать pBase
этим функциям.И невозможно иметь все возможные комбинации классов, потому что я могу добавить новые классы, просто включив новые заголовочные файлы.
Одно решение, которое пришло в голову, в редакторе я могу использовать составной контейнер:
struct CompositeObject
{
vector<Base *pBase> parts;
};
Но редактор не нуждается в оптимизации времени и может использовать dynamic_cast
для деталей, чтобы определить точный тип.В operate()
я не могу использовать это решение.
Итак, можно ли избежать использования dynamic_cast
и информации о типе для решения этой проблемы?Или, может быть, я должен использовать другую архитектуру?