Новый способ реализовать делегаты с помощью C++
ОГЛАВЛЕНИЕ
Введение
Делегирование в C++ не является новой концепцией. Имеется много его реализаций в Code Project и в Интернете вообще. Наиболее полная статья написана Доном Клагстоном, в которой он показывает все трудности, с которыми люди сталкиваются при работе с указателем на метод. С другой стороны, Сергей Рязанов представляет очень простое решение, которое использует возможность "нестандартный параметр шаблона" современного языка C++. Для пользователей функции повышения (улучшения) Boost.Function должна быть наиболее известна. Здесь приводится сравнение этих реализаций.
| Сергей Рязанов | Дон Клагстон | |
Характеристики | Использование динамической памяти для хранения информации при связывании с методом и со связанным объектом. | Использует нестандартный параметр шаблона. Легкая для понимания. | Так как каждый компилятор сохраняет указатель на метод различными способами, Дон определяет унифицированный формат для своего делегата. Следовательно, в зависимости от каждого компилятора, он преобразуется из формата компилятора в свой собственный формат. |
Отпечаток памяти | Неэффективно из-за дорогостоящего выделения памяти в «куче». | Эффективно | Эффективно |
Соответствие стандарту | Да | Да | Нет. Фактически это реализация недокументированных возможностей языка. |
Портативный | Да | Нет. Не все компиляторы C++ поддерживают нестандартный параметр шаблона. | Да. Но только в данный момент для всех известных ему компиляторов C++, и нет уверенности, что в будущем это сохранится. |
Синтаксис | Изящный | Не изящный, например: SomeObject obj; delegate d = delegate::from_member<SomeObject, &SomeObject::someMethod>(&obj); | Изящный |
Совместимы ли делегаты? | Да | Нет. Фактически есть способ добавить эту возможность в реализацию Сергея. | Да |
Простота? | Ответ положительный, если вам легко дается программирование шаблонов в C++. В противном случае ответ может быть отрицательным. | Да. Он легко понятен, даже если читатели являются начинающими в программировании шаблонов. | Нет. Вы должны иметь глубокие знания об указателях и компиляторах, чтобы понимать код. Дон предоставил полное руководство в этой стать |
Замечание: Некоторые люди сравнивали перечисленные делегаты между собой по скорости их вызова. Однако различие в несколько сотен миллисекунд для 10,000,000 вызовов делегатов не очень существенно.
Идеальный делегат должен быть совместимым со стандартом и портативным (Boost), эффективно использовать память, иметь изящный синтаксис, совместимость и простоту. Можно ли улучшить один из них до такой степени, чтобы он стал идеальным, или нужно создать новый? Да, мы собираемся создать новый делегат.