- 1
- 2
- 3
- 4
typedef typename _STD tr1::conditional<
_STD tr1::is_same<key_type, value_type>::value,
const_iterator,
_Tree_iterator<_Mybase> >::type iterator;
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+32
typedef typename _STD tr1::conditional<
_STD tr1::is_same<key_type, value_type>::value,
const_iterator,
_Tree_iterator<_Mybase> >::type iterator;
Шаблоны на шаблонах и шаблонами погоняют.
Тайпклассы
.
Это вы про меня? Тогда пример переделанного кода в студию. Он же простой, много времени у вас не отнимет ;)
http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Traversable.html
http://www.scala-lang.org/api/current/scala/collection/Traversable.html
Лолчто?
А для чего по-вашему служат итераторы? А они же, внезапно, и есть обобщенный интерфейс для обхода коллекций. Причем для языков, в которых без извратов не описать лямбду или хотя бы локальную функцию (привет Тарас), итераторы на порядок юзабельнее нежели traversable.
Теперь про коде reuse: в ваших любимых Хаскеле и Скале реализацию traverse и sequenceA пишет Александр Сергеевич Пушкин? Нет. Ее пишет автор контейнера, как и здесь. Использование conditional и is_same для вас тоже не code reuse?
Но достигнуто это такой архитектурой, по сравнению с которой код в топике - цветочки.
Впрочем, я пока не вижу пути, как применить имплиситы для достижения того-же эффекта.
Я это не вам. Просто тут
> Красивый, понятный код, в духе KISS, не находите?
некие Fai вспоминают "KISS (keep it simple, stupid — «не усложняй, тупица»)", мол типа можно сделать проще и тут же молчит, сосет и не делает проще.
Чпок-чпок-чпок.
А в С++ да, даже стандартная библиотека выглядит как говно.
> написал, как применить функцию поиска подмножества в контейнере с применением предиката
к чему это?
>> Как-то так: R find(alias pred = "a == b", R, E)(R haystack, E needle)
>> А в С++ да, даже стандартная библиотека выглядит как говно.
> написал, как применить функцию поиска подмножества в контейнере с применением предиката
А где можно отсыпскачать исходники libastral, с помощью которого можно цитировать мысли собеседников, которых нет в постах?
учитывая, что вышеприведенное им в одну строчку записывается через
boost::range::search(where, what, pred);
раз уж так не нравятся итераторы в
std::search(where.begin(), where.end(), what.begin(), what.end(), pred);
чем он хотел похвастаться, я даже в недоумении
А в вашем boost\std как сигнатура search будет выглядеть?
Ага, как-то вот так: http://www.boost.org/doc/libs/1_50_0/libs/range/doc/html/range/reference/algorithms/non_mutating/search.html
Я даже не буду сюда копипастить этот ужас.
а в языке D равно это = или всё-таки ==?
А в D - так как я привел. Ну и в теле компайл-тайм проверки на соответствие R, E и pred нужным типам.
компилятор D, встречая незнакомое слово, считает это шаблонным параметром-типом?
Но зачем она для поиске в мапе я не понял.
в с++ для этого тоже было предложение
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3329.pdf
не прижилось
поиск в мапе тут совсем не причем
приведен фрагмент из внутренней реализации std::set/std::map от MSVC - оба класса построены поверх внутреннего класса, реализующего к/ч дерево, и в какой то момент они, видимо, решают, как объявить итератор контейнера - как итератор этого внутреннего класса, или что-то более сложное
к вопросам чистоты синтаксиса - в редмонд
А __traits(isSame, key_type, value_type) можно записать как
typeof(key_type) == typeof(value_type)
Что это значит и чем мешает?
в языке с прямым доступом в память даже без const_cast всегда можно найти адрес чего-либо и насрать туда, только где тут здравый смысл?
> не защищён от записи на уровне железа
Да нет, не только. Еще претензия, что приходится дублировать код для итераторов и прочих псевдоуказателей.
Я сам обманываться рад!
сколько можно обсужать это толстое трололо "вменяемый фак"