У меня есть устаревшая часть программного обеспечения, в которой есть один менеджер, который управляет запуском программы. Он вызывает методы различных классов обратного вызова на протяжении всего выполнения программы. Это пользовательские хуки. Проблема в том, что из этих 1000 различных крючков
1) у каждого из них явно свой интерфейс
2) у менеджера бега есть слот только для одного из них.
Я заметил, что только разрешение пользователю зарегистрировать только один экземпляр каждого пользовательского подключаемого класса с помощью менеджера прогона приводит к большому количеству спагетти-кода из моей группы. Я хотел бы написать простые обертки, которые содержат список зацепок, затем перебрать список и вызвать обратный вызов каждого экземпляра. Пример:
class SomeLegacyUserActionClass
{
public:
virtual void A();
virtual void B();
};
class MyWrapper : public SomeLegacyUserActionClass
{
std::vector< SomeLegacyUserActionClass* > actionList;
public:
void A()
{
// loop over each action in actionList
{
action->A();
}
}
void B()
{
// loop over each action in actionList
{
action->B();
}
}
void addAction( SomeLegacyUserActionClass* action ) { ... }
};
Это становится очень утомительным и уродливым для такого количества классов. Есть ли какой-то способ, которым я могу сделать шаблон класса или что-то сделать это одним ударом? Здесь, очевидно, есть образец, я просто не знаю, смогу ли я извлечь из этого выгоду в C ++.
Полагаю, я мог бы заставить свою группу реализовать какой-то шаблон декоратора для всех своих действий и покончить с векторами и циклами.
Спасибо