Здравствуйте, eao197, Вы писали:
VD>>Нет? И я могу вот так за просто получить в С++ указатель на произвольный метод?
E>Дело в том, что
E>1) в C++ смысла от этого ноль -- ведь чтобы вызвать метод по указателю, нужно знать точную сигнатуру метода.
Похоже ты не понимащь о чем я веду речь.
E>2) с помощь явных кастов в C++ можно привести указатель на один метод к указателю на другой метод. Только это нафиг не нужно.
Это тут не причем.
VD>>Странно. А ведь boost::bind это море очень не быстро компилируемого кода который использует уж совсем не кчемную функциональность языка вроде указателей на методы. И все это вмесо примитивной модификации языка.
E>Никчемность указателей на методы -- это собственное впечатление?
E>Лично мне они кажутся настолько же удобными, как и указатели на функии. И время от времени я ими пользуюсь.
Приведи пример где ты их используешь. Я видел их использование только в коде который пытался эмулировать функцинальность делегата (назавем его так, чтобы отличать от того что есть в С++).
Только перед тем как приводить убедись, что ты правильно меня понял. Речь идет не о С-шном указателе на глобальную функцию, а о С++-ном указателе на функцию-член класса.
VD>>Мне не хочется в очередной раз писать трактат о функциональных типах. Кажется о них было сказано уже довольно много. Ну, да если ты действительно не понимашь всю глубину маразма этой ситуации, то скажи... и я попытаюсь описать ее более детально.
E>Опиши.
Может лучше поискать?
Ладно. Попробую...
Итак в старые добрые времена когда ООП был только в речах продвинутых ученых и Смолтоке в С был очень удобный тип — указаетель на функцию. Мы могли взять имя функции и передаь его куда угодно, чтобы в последсвии этот кто угодно вызвал нужную нам функцию. Даже оконная функция в виндовс — это указатель на функцию. Если нам было нужно передать контекст, то мы просто передавали два указателя один на функцию, а второй на переменную олицетварющую контекст. И все было зашибись, до тех пор пока на сменую С не пришел С++.
В этот момент уже существовало не мало языков в которых был функциональный тип. Дже в Смолток было нечто вроде. Страуструп почему-то решил, что делать указатель на метод с определенной сигнатурой но не привязанный к конкретному классу — это не объектно ориентированно, не безопастно и вообще мовитон. О том что людям как не крути потребуется еще и указатель на объект он вообще думать не захотел. Но сделать объекто ориентированный аналог указателя на функцию из С он все же захотел. В результате родился уродец под названием указатель на метод-член конкретного класса. Это указатель не хранит ссылку на объект, но зато очень жестко привязан к классу в котором должен быть метод на ктороый нужно получить указатель. В итоге получается, что через него можно вызвать только методы конкретного класса. Но для ОО-колбэков и программирования в функциональном стиле это и на фиг не уперлось! Для них нужна возможность вызвать метод у объекта тип которого не важен для вызывающей стороны. В общем получился уродец единственно существенное применение которого стала эмуляция делегатов. При этом получается целая гора кода которую не только долго компилировать, но еще и чертовски сделать универсальной (компилирующейся на разных компиляторах). На сегодня появились реализации вроде boost::bind, но это только сеогодня и компилируются они только на правильных компиляторах. Так что из-за ошибки Страусрупа и откровенно детского каприза много лет народ мучился. Конечно библиотека — это лучше чем ничего. Но это эмуляция примитива горой кода! И зачем капризничать вместо того чтобы ввести еще один примитив лично я не понимаю.
E>
Какое отношение этот рассказ имеет к вопросу? Повторю еще раз цитаты:
VD>>>Да, не понимаю. Сборка это набор байт. Всегда можно скачать...
E>>Нет. Далеко не всегда.
VD>И когда нельзя?
VD>Раскрывай.
E>
E>Use case 2: Unknown Traits
Хотлось бы услышать ответ на мой вопрос, а не монолог на отвлечанную тему.
Что же до сериализации, то это проблемы С++ в ремоутинге и КОМ-е они решаются.
E>
E>Use case 3: Protocol Versions
E>Так же описано: Неизвестные расширения (можно прочитать пункты Введение и Применение неизвестных расширений)
К сожалению я пишу в офлайне и тыкать по внешним ссылкам не могу. Так что ты лучше кратенько приведи обоснование почему нельзя передать сборку на клиента? Причем не нужно рассказывать по тараканы плюсов или еще какой-то технологии. Мы же с дотнетом сравнивали. Вот и ошиши причины невозможности в отношении сборок дотнета.
E>
E>Хочу отметить, что все приведенные случаи не требуют того, чтобы взаимодействующие стороны точно знали типы используемых для коммуникации объектов.
Для передачи по сети нужна только сериализация. Если она делается вручную или генератором кода, то на клиенте сборка не обязательна. Ну, и всегда можно сделать простенькое решение которое сможет копировать нужные интерфесные сборки в автомате. Итго — это не языковая проблема. Это проблема дизайна.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>