ad-hoc monad / C++

Jul 31, 2020 03:20


Себе на память, другим на наущенье: https://ideone.com/cDSU3x

(не рассматривайте это как пример хорошего кода; просто... пусть будет)

Потребовалось написать кое-какие довольно ветвистые вычисления с кучей проверок и протаскиванием кодов ошибок. Причём, оставаясь в рамках C++1z (фичи 14 уже все есть, фичи 17 - местами).

Дано:

- тип значения (tf2::Transform, если кому-то это важно), над которым определена группа (1, *, ~)

- горстка функций, возвращающих эти значения или ошибки

- убер-функция, декомпозирующая вычисления, с фолбеками «не получилось так, попробуем этак»

Написал сперва на ветвлениях и понял, что отлаживать это всё - лютый геморрой.

Сделал лифт в «значение + трассировка», чтобы видеть, как получается результат. Затем лифт в «значение или ошибка», чтобы видеть, что пошло не так. Затем добавил ленивости, чтобы не дёргать альтернативы без нужды.

И вот теперь думаю: если я этот эскиз перетащу в рабочий проект, коллеги меня убьют или похвалят?

А может, ну его нафиг, отдебажу старый добрый код без наворотов? Ну подумаешь, вместо выражений там гора ифов...

Да, самое коварное, что хотел сказать... std::variant недоступен, а boost::variant содержит ошибки! Он сходит с ума от move semantics. Поэтому пришлось немножко поизвращаться со static_cast...

черновик, программирование, c++

Previous post Next post
Up