Re: Обработка событий в С++
Здравствуйте.
Идея хорошая. Мне тоже приходили в голову мысли сделать что-то подобное, так что будет что
дополнить. М. б. окажется полезным.
Во-первых, Вы сохраняете и вызываете указатель на функцию-обработчик как указатель на член
структуры slot::Thunk. Это неправильно, потому что не будет работать со множественным
наследованием, также как и в классическом случае с приведением к void*. При множественном
наследовании может требоваться коррекция указателей для вызова методов.
Так что придётся параметризовать класс slot классом Owner, методы которого оттуда
вызываются, либо предпринимать усилия для коррекции указателей вручную — запонминать
смещение и потом его прибавлять/вычитать. Конечно, если не предполагается использовать
механизм вместе со множественным наследованием, то ничего такого делать не нужно. Надо
только предупредить об этом как об ограничении.
В первом случае страшного ничего нет, поскольку один и тот же объект будет использоваться
только с одинм Owner'ом. Здесь возникает единственно потребность сделать общий базовый класс
для наследования под разных Owner'ов и объявить _call() виртуальной.
Во-вторых, по поводу (кажущейся) избыточности. Вам не приходила мысль избавиться от
необходимости хранения в каждом slot'е указателя на Owner'а? Он же его содержит. Я точно не
знаю, возможно ли это, но есть соблазн попробовать вычислять смещение к члену типа slot
внутри Owner'а.
Можно ещё рассмотреть вариант, при котором созданные слоты удалять не нужно, тогда не нужен
двунаправленный список, достаточно однонаправленного. Ещё можно убрать указатели вообще,
добавив в slot указатель на signal, а в signal сохранить массив подцепленных slot'ов. Второе
нам ничего не экономит, лишь позволяет установить обратную связь, которая может пригодиться,
но в обмен на то, что невозможно будет привязать один slot к нескольким signal'ам.
Спасибо.
Пока на собственное сообщение не было ответов, его можно удалить.