Lex Kravetski (lex_kravetski) wrote,
Lex Kravetski
lex_kravetski

Category:

 

 

Задача для C++ программеров. Решение ее мне в свое время доставило много интересных часов.

 

Требуется: механизм подписки, удовлетворяющий следующим условиям:

 

1.             Объект-подписчик не должен в обязательном порядке наследоваться от какого-либо класса.

2.             Объекту-нотификатору достаточно один раз унаследоваться от базового класса, чтобы реализовать произвольное число событий подписки.

3.             Подписка должна выполняться следующим образом: нотификатору при подписке передается идентификатор события и указатель на функцию, которую следует вызвать при происхождении события с этим идентификатором.

4.             Передаваемая функция является имеет произвольный тип параметра. Заранее он неизвестен. Объект-нотификатор должен быть реализован так, чтобы принимать при подписке указатель на любую функцию с любым параметром. Имя функции также может быть произвольным (то есть, в базовом объекте оно не должно быть жестко задано).

5.             При нотификации о событии, нотификатор (наследник базового объекта) передает также значение параметра функции. Возможен вызов функций с разными типами параметров при одном и тот же идентификаторе.

6.             Ни подписчик, ни нотификатор не должны использовать в явном виде преобразование типов. То есть, все преобразования должны быть сокрыты в базовом классе.

 

Задача имеет решение. Решение сложное. Но практика реализации просто бесценна – после решения этой задачи никаких проблем с шаблонами никогда больше не будет.

 

 

Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 5 comments