Невероятно быстрые делегаты 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 вы можете использовать его двумя способами:
- Вы абсолютно уверены, что клиент события существует дольше, чем инициатор события.
- Вы должны использовать boost::signals::trackable как базовый класс клиента события (можно реализовать аналог в нашей библиотеке, но мы не уверены, что это хорошая идея).
Вы можете применять это в делегатах с многократным приведением в стиле C#, но здесь возникает другая проблема: вы должны поддерживать пары действий (подписка и отмена подписки), но их правильность нельзя проверить во время компиляции.
Более подробную информацию смотрите в документации.
Заключение
Возможно, какие-то детали конструкции C++ не идеальны, но мы не увидели причины нарушать стандарт C++. Более того, иногда применение трюков не позволяет оптимизаторам реализовать все свои возможности.
Загрузить исходный код - 35.7 Kb