Указатели на функции-члены и реализация самых быстрых делегатов на С++.

Автор: Don Clugston
CSG Solar Pty Ltd

Перевод: Денис Буличенко
Источники: Member Function Pointers and the Fastest Possible C++ Delegates
RSDN Magazine #6-2004
Опубликовано: 19.03.2005
Версия текста: 1.0
Введение
Указатели на функции
Указатели на функции-члены
Жуткие сведения об указателях на функции-члены
Применение указателей на функции-члены
Указатели на функции-члены – почему они такие сложные?
Реализация указателей на функции-члены
Грязная история о технологии Microsoft «меньший для класса»
Делегаты
Мотивация: потребность в очень быстрых делегатах
Хитрость: приведение любого указателя на функцию-член к стандартной форме
Статические функции как цели делегатов
Использование кода
Возвращаемые значения, отличные от void
Использование FastDelegate как аргумента функции.
Лицензия
Переносимость
Заключение

Введение

В стандарте С++ нет настоящих объектно-ориентированных указателей на функции. Это очень плохо, т.к. объектно-ориентированные указатели на функции, также известные как делегаты, доказали свою значимость в аналогичных языках. В Delphi (Объектный Паскаль) они являются основой библиотеки визуальных компонент (VCL). В большинстве приложений делегаты упрощают использование элегантных паттернов проектирования (Наблюдатель, Стратегия, Состояние [GoF]). Нет никакого сомнения , что такая возможность была бы очень полезна в стандартном С++.

Вместо делегатов С++ предоставляет указатели на функции-члены. Большинство С++-программистов никогда не использовали указатели на функции-члены, и в общем-то, по понятной причине. У этих указателей свой собственный ужасающий синтаксис (операторы ->* и .* , например), по ним трудно найти информацию, и большинство вещей, реализуемых с их помощью, лучше реализуются другими способами. Интересная ситуация: производителю компилятора проще реализовать делегаты, нежели указатели на функции-члены!

В этой статье я приоткрою завесу над указателями на функции-члены. После напоминания о синтаксисе и идеологии указателей на функции-члены, я объясню, как все это реализуется на наиболее популярных компиляторах. Покажу, как компиляторы могут эффективно реализовать делегатов. И наконец, я продемонстрирую, как, используя все эти знания, сделать реализацию оптимально эффективных делегатов. Например, вызов простого делегата на Visual C++ генерирует всего лишь две строчки ассемблерного кода!

Указатели на функции

Указатели на функции-члены

Жуткие сведения об указателях на функции-члены

Применение указателей на функции-члены

Указатели на функции-члены – почему они такие сложные?

Реализация указателей на функции-члены

Грязная история о технологии Microsoft «меньший для класса»

Делегаты

Мотивация: потребность в очень быстрых делегатах

Хитрость: приведение любого указателя на функцию-член к стандартной форме

Статические функции как цели делегатов

Использование кода

Возвращаемые значения, отличные от void

Использование FastDelegate как аргумента функции.

Лицензия

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

Заключение


Полная версия этой статьи опубликована в журнале RSDN Magazine #6-2004. Информацию о журнале можно найти здесь