Указатели функций-членов и наиболее быстрые делегаты C++

ОГЛАВЛЕНИЕ

Обстоятельное руководство об указателях функций-членов и реализация делегатов, которая генерирует только два кода операции ассемблера!

Введение

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

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

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