Насчет множественной в плюсах, джаве, лиспе не знаю, но например встроенной в эрланге нет, но можно легко реализовать на прикладном уровне. Через, например spawn|gen_server|gen_fsm|receive, благодаря легковесности процессов.
Хм, всегда думал что визитор служит только для эмуляции двойной диспетчеризации
А как написать такой визитор, чтоб больше одного параметра принимал? Для двух например
Так еще хешмапу надо заполнить как-то. Придется typeid выковыривать какой-то для всех возможных типов параметров мультиметода. Эх, грустно всё это. Не то что в лиспе.
Написал на джаве, но на плюсы трансляция будет один в один. Думаю реализации accept-ов в VisitableX можно макросами зафигачить и будет вполне читабельно.
Могу! Даже не смотря на экспоненциальный рост кода от числа параметров мультиметода.
Наверно в йаве есть даже фреймворк/либа на эту тему, раз всё так просто и красиво.
Это ты зацикленный, ограниченный и убогий, а плюсы дают достаточно возможностей для высокоуровневых абстракций, зачастую вполне лаконичных. Большинство проблем начинается, когда всякие одаренные личности делают из него троллейбус.
а плюсы дают достаточно возможностей для высокоуровневых абстракций, зачастую вполне лаконичных
как минимум предполагает некие «возможности», которых нет в популярных языках, что делает таки C++ способным на определение «высокоуровневых абстракций», которые «зачастую вполне лаконичны»... Расскажи о них. Когда ещё встретишь такого великого человека, который просёк как C++, так и Lisp и точно знает кто «зацикленный, ограниченный и убогий» :)
некие «возможности», которых нет в популярных языках, что делает таки C++ способным на определение «высокоуровневых абстракций»
Из моего заявления никак не следует, что в С++ должны быть какие-то уникальные фичи, которых нет в других языках. Я сказал, что С++ предоставлят достаточно (я это слово выделяю, потому что в исходном сообщении ты на его месте увидел какое-то другое) средств для построения абстракций. Ты разницу видишь? Но ты можешь быть спокоен, в твоем лишпике таких средств больше. Ты победил! :) :) :)
как минимум предполагает некие «возможности», которых нет в популярных языках, что делает таки C++ способным на определение «высокоуровневых абстракций», которые «зачастую вполне лаконичны»...
1. Класс как пространство имён
2. templates с инстанцированием по типам и целым значениям.
Практически безграничны в планет построения «высокоуровневых абстракций»
Можешь привести на любом другом языке аналог http://loki-lib.sourceforge.net/html/a00038.html с не худшими характеристиками производительности (все решения должны быть на стадии компиляции) и гибкостью (хотя бы EvictionPolicy и StatisticPolicy).
Во-первых, ну очень понятная дока. Там написано чуть менее чем нихуя. И документация по Loki полное говно. Что такое «EvictionPolicy и StatisticPolicy» там не написано (расскажи, что это или дай ссылку где можно почитать), зато написано:
template<class AbstractProduct, typename IdentifierType, typename CreatorParmTList = NullType, template< class > class EncapsulationPolicy = SimplePointer, class CreationPolicy = AlwaysCreate, template< typename, typename > class EvictionPolicy = EvictRandom, class StatisticPolicy = NoStatisticPolicy, template< typename, class > class FactoryErrorPolicy = DefaultFactoryError, class ObjVector = std::vector<AbstractProduct*>>
class Loki::CachedFactory< AbstractProduct, IdentifierType, CreatorParmTList, EncapsulationPolicy, CreationPolicy, EvictionPolicy, StatisticPolicy, FactoryErrorPolicy, ObjVector >
Что как бы намекает нам на невероятную лаконичность и выразительность языка.
Во-вторых, все 3 пункта которые ты перечислил к этому не имеют никакого отношения. Тут как бы сразу видно, что это шаблонная магия. И даже беглого взгляда на исходик этой библиотеки достаточно, что бы понять, что большая часть исходиков сгенерирована внешним инструментарием. Очень удобное метапрограммрование. Ну просто уууочень!
И документация по Loki полное говно. Что такое «EvictionPolicy и StatisticPolicy» там не написано (расскажи, что это или дай ссылку где можно почитать),
EvictionPolicy — определяет объекты, которые надо выкинуть из кэша
StatisticPolicy — определяет метод сбора статистики по кэшу (сколько создано, вернуто из кэша/не из кэша, удалено, ...)
Что как бы намекает нам на невероятную лаконичность и выразительность языка.
Ну сэкономил автор на typedef'ах. А в целом вполне читабельно. В CLOS (например) тоже для каждого слота приходится писать (foo :initarg :foo :accessor foo) и лаконичней не делают (хотя макросы позволяют).
Можешь на любимом языке написать функцию с одним параметром, которая при получении функции с типом (int, int) -> int вызывала, её с параметрами 2 и 3, а при получении функции с типом (string)->int вызывала её с парметром «ok»? Хочу помотреть насколько лаконично у тебя получится.
Вообще-то так в любом языке. При написании кода на С нужно думать процедурами, в Haskell - фукционально. В Java - классами. Иначе твой код будет некрасиво громоздким и/или тормознутым. Если ты не обладаешь достаточной гибкостью мышления - это твоя проблема, а не языка. Не пиши на нем.