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