Здравствуйте, 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++ ничего подобного нет и по сей день.