Re[14]: Rust vs C++ 17
От: Evgeny.Panasyuk Россия  
Дата: 10.01.16 04:25
Оценка: :)))
Здравствуйте, red75, Вы писали:

R>>>Я где-то тут приводил темплейтно/макросный ужас, который нужен для более-вменяемого discriminated union.

EP>>Готовый Boost.Variant есть уже больше 13 лет — бери и используй. Если хочется реализовать свой, то на C++14 он реализуется на порядки проще чем на C++98.
R>Отсутствие прямой поддержки языком сложно компенсировать. Нормальный pattern-matching c case totality check библиотекой не сделаешь.

Сделаешь. Pattern-matching по типам (то что нужно для Variant) есть в C++ начиная с C++98, totality check автоматом вытекает из свойств перегрузки.
Лямбды для inplace-ности появились в C++11, да

R>А так можно, конечно, и гланды ректально вырезать.

R>Почему boost::variant требует динамическое выделение памяти: http://www.boost.org/doc/libs/1_59_0/doc/html/variant/design.html#variant.design.never-empty.heap-backup-solution

Это выделение есть только в определённых случаях. При этом даже если бы Variant был встроен в язык — то этот tradeoff всё равно пришлось бы так или иначе совершать

R>Небольшая библиотечка, которая работает начиная с gcc 4.7, то есть 4 года, позволяющая более-менее комфортно извлекать значения из variant https://github.com/exclipy/inline_variant_visitor


Ну да, с появлением лямбд inline-обход спокойно реализуется, например
Автор: Evgeny.Panasyuk
Дата: 23.10.14
:
vector<variant<int, double>> ys;
for(auto x : xs)
    ys.push_back
    (
        MATCH(x)
            CASE(x IS widget) { println("x IS widget"); return 1; }
            CASE(x IS gadget) { println("x IS gadget"); return 0.1; }
    );


R>то есть 4 года


То есть пока Rust пешком под стол ходил, в реальных проектах C++ можно было не только использовать Variant, но и комфортно его обходить, с гарантией обратной совместимости. При этом в mainstream языках помимо C++ ничего подобного нет и по сей день.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.