Следуя рекомендации @ anno, чтобы посмотреть на boot :: signal, после проверки она кажется возможной, хотя, как и ожидалось, она не так проста, как объективные решения C. Просматривая учебник boost :: signal , я подумал, что расскажу о наиболее важных аспектах рассматриваемой проблемы.
Чтобы создать отправителей уведомлений:
Рассмотрим простую службу доставки новостей, где клиенты подключаются к поставщику новостей, который затем отправляет новости всем подключенным клиентам по мере поступления информации. Служба доставки новостей может быть построена так:
class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;
Целью deliverNews
является информирование наблюдателей о том, что NewsItem
был сгенерирован.
Наблюдатели могут быть добавлены следующим образом (с использованием библиотеки boost :: bind):
Клиенты, которые хотят получать обновления новостей, должны только подключить функциональный объект, который может получать новости, к сигналу deliveryNews. Например, у нас может быть специальная область сообщений в нашем приложении специально для новостей, например:
struct NewsMessageArea : public MessageArea
{
public:
// ...
void displayNews(const NewsItem& news) const
{
messageText = news.text();
update();
}
};
// ...
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
// ...
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1));
Для решения проблемы удаления наблюдателей, которые были освобождены из списка, boost :: signal предлагает следующее решение
Однако, что если пользователь закрывает область сообщения новостей, уничтожая
объект newsMessageArea, о котором знает deliveryNews? Скорее всего,
произойдет ошибка сегментации. Однако с Boost.Signals нужно
только сделать отслеживание NewsMessageArea, а слот с участием
newsMessageArea будет отключено, когда newsMessageArea будет
уничтожены. Класс NewsMessageArea отслеживается путем получения
публично из класса boost :: signal :: trackable, например ::1029*
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
В настоящее время существует значительное ограничение на использование отслеживаемых
объекты в создании соединений слотов: функциональные объекты, построенные с использованием
Boost.Bind понимаются так, что указатели или ссылки на
отслеживаемые объекты, переданные в boost :: bind, будут найдены и отслежены.