Fast C ++ Делегаты

Я осведомлен о следующих подходах к делегатам C ++:

, Интерфейсы с чисто виртуальными функциями.

Boost.Function.

Самые быстрые делегаты C ++.

Невозможно быстрые делегаты C ++.

Быстрые C ++ Делегаты.

Fast C ++ Delegate: Boost.Function 'вставной замена и многоадресная рассылка

У каждого есть свои плюсы и минусы. Некоторые быстрее, некоторые более гибкие, некоторые более функциональные, некоторые более совместимые со стандартами, а некоторые более портативные, но я лично считаю, что третий любит: Сергей Рязанов 'Невозможно быстрые C ++ делегаты. Проблема, однако, в том, что его делегаты не сопоставимы:

Моих делегатов нельзя сравнивать. Операторы сравнения не определены, потому что делегат неt содержит указатель на метод. Указатель на функцию-заглушку может быть разным в разных единицах компиляции.

На что читатели ответили: «

Указатель на функцию-заглушку может быть разным в разных единицах компиляции. " AFAIK, это не правда. Компиляторы обязаны повторно использовать шаблонные функции, сгенерированные в разных блоках компиляции (в этом я уверен - но я думаю, что Borland однажды нарушил это правило). Я думаю, что это потому, что классы (не вбезымянный пространства имен) использовать внешнюю связь, и то, как вы используете функции-заглушки, всегда предотвращает их вставку (хотя это не должноЭто также может быть проблемой, поскольку получение адреса функции приведет к генерации не встроенной версии ивнешняя связь ' выполненная компоновщиком устранит все, кроме одной функции с аналогичным именем (они предполагаются и должны быть идентичными по стандарту)) ...

Если вы определяете шаблонную функцию для одного модуля перевода (файл cpp), а затем определяете ту же функцию по-разному в другом модуле перевода, только одна из двух версий превратит ее в конечный исполняемый файл. (Это на самом деле нарушаетПравило одного определения ", но работает на GCC, по крайней мере ... не уверен насчет MSVC.) Дело в том, что адрес [заглушки] будет одинаковым в разных единицах.

Я призываю вас обновить статью (включая возможности сравнения), если вы сочтете, что это верно для MSVC - если MSVC является стандартом, в этом отношении.

Сейчас статье четыре года, а автору нетЯ ответил на любой из комментариев за последние три года или около того, поэтому ямне интересно, если естьЕсть ли смысл в приведенном выше комментарии и можно ли действительно изменить эту конкретную реализацию для поддержки сравнений. Запрещает ли стандарт C ++ такое использование, и если да, то является ли какой-либо из последних компиляторов действительно совместимым со стандартом в этом отношении?

Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос