У меня есть структура данных, которая представляет поезд, который может состоять из многих типов вагонов, например, железнодорожных двигателей, вагонов, пассажирских вагонов и т. Д.
struct TrainCar {
// ...
Color color;
std::string registration_number;
unsigned long destination_id;
}
struct PowerCar : TrainCar {
// ...
const RealPowerCar &engine;
}
struct CargoCar : TrainCar {
// ...
const RealCargoCar &cargo;
bool full;
}
std::vector<TrainCar*> cars;
cars.push_back(new TrainCar(...));
cars.push_back(new TrainCar(...));
cars.push_back(new CargoCar(...));
cars.push_back(new CargoCar(...));
cars.push_back(new CargoCar(...));
Алгоритм будет перебирать вагоны в поезде и решать, как прокладывать / шунтировать каждый вагон (следует ли оставить его в поезде, переместить его в другую точку поезда, удалить из поезда). Этот код выглядит так:
std::vector<TrainCar*>::iterator it = cars.begin();
for (; it != cars.end(); ++it) {
PowerCar *pc = dynamic_cast<PowerCar*>(*it);
CargoCar *cc = dynamic_cast<CargoCar*>(*it);
if (pc) {
// Apply some PowerCar routing specific logic here
if (start_of_train) {
// Add to some other data structure
}
else if (end_of_train && previous_car_is_also_a_powercar) {
// Add to some other data structure, remove from another one, check if something else...
}
else {
// ...
}
}
else if (cc) {
// Apply some CargoCar routing specific logic here
// Many business logic cases here
}
}
Я не уверен, является ли этот шаблон (с динамическими_кастами и цепочкой операторов if) лучшим способом для обработки списка простых структур различных типов. Использование dynamic_cast кажется некорректным.
Один из вариантов - переместить логику маршрутизации в структуры (например, (* it) -> route (is_start_of_car, & some_other_data_structure ...)), однако я хотел бы сохранить логику маршрутизации, если это возможно.
Есть ли лучший способ перебора различных типов простой структуры (без методов)? Или я придерживаюсь метода dynamic_cast?