оболочка для передачи обратного вызова в список компонентов c ++ - PullRequest
1 голос
/ 17 февраля 2012

У меня есть устаревшая часть программного обеспечения, в которой есть один менеджер, который управляет запуском программы. Он вызывает методы различных классов обратного вызова на протяжении всего выполнения программы. Это пользовательские хуки. Проблема в том, что из этих 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 ++.

Полагаю, я мог бы заставить свою группу реализовать какой-то шаблон декоратора для всех своих действий и покончить с векторами и циклами.

Спасибо

1 Ответ

0 голосов
/ 17 февраля 2012

Это невозможно с шаблонами, потому что нет способа получить список функций-членов типа для использования в шаблоне. Если у вас действительно много классов, было бы разумно использовать классическую генерацию кода.

...