Новый способ реализовать делегаты с помощью C++

ОГЛАВЛЕНИЕ

Решение проблем с некоторыми текущими реализациями делегатов в C++

Введение

Делегирование в C++ не является новой концепцией. Имеется много его реализаций в Code Project и в Интернете вообще. Наиболее полная статья написана Доном Клагстоном, в которой он показывает все трудности, с которыми люди сталкиваются при работе с указателем на метод. С другой стороны, Сергей Рязанов представляет очень простое решение, которое использует возможность "нестандартный параметр шаблона" современного языка C++. Для пользователей функции повышения (улучшения) Boost.Function должна быть наиболее известна. Здесь приводится сравнение этих реализаций.

 

Boost.Function

Сергей Рязанов

Дон Клагстон

Характеристики

Использование динамической памяти для хранения информации при связывании с методом и со связанным объектом.

Использует нестандартный параметр шаблона. Легкая для понимания.

Так как каждый компилятор сохраняет указатель на метод различными способами, Дон определяет унифицированный формат для своего делегата. Следовательно, в зависимости от каждого компилятора, он преобразуется из формата компилятора в свой собственный формат.

Отпечаток памяти

Неэффективно из-за дорогостоящего выделения памяти в «куче».

Эффективно

Эффективно

Соответствие стандарту

Да

Да

Нет. Фактически это реализация недокументированных возможностей языка.

Портативный

Да

Нет. Не все компиляторы C++ поддерживают нестандартный параметр шаблона.

Да. Но только в данный момент для всех известных ему компиляторов C++, и нет уверенности, что в будущем это сохранится.

Синтаксис

Изящный

Не изящный, например:

SomeObject obj;

delegate d = delegate::from_member<SomeObject, &SomeObject::someMethod>(&obj);

Изящный

Совместимы ли делегаты?

Да

Нет. Фактически есть способ добавить эту возможность в реализацию Сергея.

Да

Простота?

Ответ положительный, если вам легко дается программирование шаблонов в C++. В противном случае ответ может быть отрицательным.

Да. Он легко понятен, даже если читатели являются начинающими в программировании шаблонов.

Нет. Вы должны иметь глубокие знания об указателях и компиляторах, чтобы понимать код. Дон предоставил полное руководство в этой стать

 Замечание: Некоторые люди сравнивали перечисленные делегаты между собой по скорости их вызова. Однако различие в несколько сотен миллисекунд для 10,000,000 вызовов делегатов не очень существенно.

Идеальный делегат должен быть совместимым со стандартом и портативным (Boost), эффективно использовать память, иметь изящный синтаксис, совместимость и простоту. Можно ли улучшить один из них до такой степени, чтобы он стал идеальным, или нужно создать новый? Да, мы собираемся создать новый делегат.