Шрифт:
Введение
Делегаты - это объектно-ориентированные указатели на функции, используемые для callback-вызовов в среде CLR фирмы Microsoft. Делегат можно связать со статической функцией или с нестатическим методом любого класса (единственное условие - совпадение сигнатуры метода с сигнатурой, указанной в описании делегата). Затем связанную с делегатом функцию или метод можно вызывать, используя стандартный синтаксис вызова функции в C++. Несколько делегатов можно связать в цепочку. Благодаря этому можно "одним махом" вызвать все связанные с ними callback-функции. Следующий пример демонстрирует применение делегатов в языке C#.
Делегаты в CLR удобны, типобезопасны и эффективны. Последнее время на форумах RSDN часто
Частное решение
Для начала создадим делегат для callback-вызова функций и методов с простейшей сигнатурой void(void). Интерфейс этого делегата будет выглядеть так.
Invoke используется для вызова функции или метода, связанного с делегатом, а Compare сравнивает 2 делегата и возвращает true, если они связаны с одной и той же функцией (методом). Очевидно, что реализация интерфейса IDelegateVoid будет отличаться для статических функций и нестатических методов класса, поэтому мы разнесём эти реализации по различным классам. Класс CStaticDelegateVoid будет "отвечать" за статические функции, а класс CMethodDelegateVoid– за нестатические методы.
Класс CStaticDelegateVoid просто инкапсулирует указатель типа void (*):
Метод Compare должен проверить, что переданный ему указатель IDelegateVoid* в действительности ссылается на объект CStaticDelegateVoid. Если это не так, делегаты различны (ссылаются на разные функции) и Compare просто возвращает false. Иначе результат определяется сравнением переменных-членов m_pFunc у двух объектов. Реализация этой идеи выглядит так.
Класс CMethodDelegateVoid чуть-чуть сложнее. Он должен инкапсулировать указатель на объект и указатель на метод этого объекта. Поскольку в C++ указатели на методы двух разных классов принципиально отличаются (и могут даже иметь разный размер), нам нужна отдельная реализация CMethodDelegateVoid для каждого нового класса, на методы которого мы хотим ссылаться. Поэтому класс CMethodDelegateVoid должен быть шаблоном. В остальном его реализация аналогична CStaticDelegateVoid.
Вечный. Книга I
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
рейтинг книги
Как притвориться идеальным мужчиной
Дом и Семья:
образовательная литература
рейтинг книги
Тот самый сантехник. Трилогия
Тот самый сантехник
Приключения:
прочие приключения
рейтинг книги
Третий. Том 4
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
рейтинг книги
В погоне за женой, или Как укротить попаданку
Фантастика:
фэнтези
рейтинг книги
Дочь Хранителя
1. Легенды Сопределья
Фантастика:
фэнтези
рейтинг книги
Соль этого лета
1. Самбисты
Любовные романы:
современные любовные романы
рейтинг книги
Измена. Тайный наследник
1. Тайный наследник
Фантастика:
фэнтези
рейтинг книги
Он тебя не любит(?)
Любовные романы:
современные любовные романы
рейтинг книги
Брачный сезон. Сирота
Любовные романы:
любовно-фантастические романы
рейтинг книги
Английский язык с У. С. Моэмом. Театр
Научно-образовательная:
языкознание
рейтинг книги
