Typesafe система обратного вызова в современном C ++ - PullRequest
4 голосов
/ 24 октября 2011

Я работаю над модулем, который использует систему обратного вызова, которая не была реализована очень хорошо.Клиенты регистрируются с идентификатором и будут перезваниваться с переменной (или два, или ни одного).Проблема в том, что практически для каждого идентификатора есть разные переменные(Например: Id1 -> char*, Id2 -> int).Это достигается передачей переменной через указатель.Таким образом, обратный вызов выглядит как

typedef void (*NotifFunctionPtr)(void* ctx, const void* option);

С таким подходом много проблем, и я хочу заменить его на (тип) безопасный и современный способ обработки этого.Однако это не так просто, как кажется, у меня есть некоторые идеи (like boost::function или замена void* структурой, которая инкапсулирует type и ptr), но я думаю, что, возможно, есть лучшая идея, поэтому мне было интересно каков современный способ настройки безопасного обратного вызова в C ++ .

Редактировать: Другая идея состоит в регистрации обратного вызова с типом T через функцию шаблона, которая вызывает обратный вызов с тем же типом T.это жизнеспособно или реализовано в библиотеке?

Ответы [ 3 ]

10 голосов
/ 24 октября 2011

Ваша проблема не в обратных вызовах, а в том, что вы хотите рассматривать все обратные вызовы как один и тот же тип, когда они не совпадают (подписи разные). Так что либо вы делаете неприятный трюк C void*, либо если вы хотите использовать type-safe подход, вам придется заплатить за него и предоставить разные методы для регистрации различных типов обратного вызова - что, по-моему, это правильный путь.

После того, как вы это решили, вы можете использовать библиотеки signals или signals2 или реализовать собственное колесо, используя function в качестве основы (чтобы избежать необходимости перезаписывать стирание типа).

3 голосов
/ 24 октября 2011

boost::function это просто правильный выбор здесь. Вы получаете безопасность типов для функциональных объектов без особого изменения кода.

2 голосов
/ 24 октября 2011

Если вы уже смотрели в буст.Почему бы не использовать библиотеку сигналов или сигналов2 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...