Невероятно быстрые делегаты C++ - Переносимость

ОГЛАВЛЕНИЕ

Переносимость

Хотя этот подход совместим со стандартами C++, к сожалению, он не работает в некоторых компиляторах. Нам не удалось скомпилировать тестовый код в Borland C++. Предпочтительный синтаксис не работает в MSVC 7.1, хотя он успешно компилирует boost::function с таким же синтаксисом.

Вероятно, это происходит из-за применения редко используемых возможностей языка.

Библиотека событий

Мы предлагаем библиотеку событий, демонстрирующую, что делегатам фактически не нужны операции сравнения. На самом деле эта библиотека событий не связана с нашими делегатами. Она может работать со многими типами делегатов, включая boost::function. Также она может работать с интерфейсами обратного вызова (наподобие тех, что есть в Java).

Наша библиотека событий предоставляет быстрый метод, позволяющий подписаться и отменить подписку на инициатор события (даже во время порождения события) и также не использует динамическое распределение памяти (это должно быть важно, если вас интересуют быстрые делегаты).

Эта библиотека предоставляет две сущности: event_source (это упрощенный аналог boost::signal) и event_binder (аналог boost::signals::scoped_connection). Обычно инициатор события содержит event_source и клиент события содержит event_binder. Связь между инициатором и клиентом существует, пока оба - event_source и event_binder  - существуют.

Вы не можете использовать анонимное соединение. Фактически в Boost вы можете использовать его двумя способами:

  1. Вы абсолютно уверены, что клиент события существует дольше, чем инициатор события.
  2. Вы должны использовать boost::signals::trackable как базовый класс клиента события (можно реализовать аналог в нашей библиотеке, но мы не уверены, что это хорошая идея).

Вы можете применять это в делегатах с многократным приведением в стиле C#, но здесь возникает другая проблема: вы должны поддерживать пары действий (подписка и отмена подписки), но их правильность нельзя проверить во время компиляции.

Более подробную информацию смотрите в документации.

Заключение

Возможно, какие-то детали конструкции C++ не идеальны, но мы не увидели причины нарушать стандарт C++. Более того, иногда применение трюков не позволяет оптимизаторам реализовать все свои возможности.

Загрузить исходный код - 35.7 Kb