Себе на память, другим на наущенье:
https://ideone.com/cDSU3x (не рассматривайте это как пример хорошего кода; просто... пусть будет)
Потребовалось написать кое-какие довольно ветвистые вычисления с кучей проверок и протаскиванием кодов ошибок. Причём, оставаясь в рамках C++1z (фичи 14 уже все есть, фичи 17 - местами).
Дано:
- тип значения (tf2::Transform, если кому-то это важно), над которым определена группа (1, *, ~)
- горстка функций, возвращающих эти значения или ошибки
- убер-функция, декомпозирующая вычисления, с фолбеками «не получилось так, попробуем этак»
Написал сперва на ветвлениях и понял, что отлаживать это всё - лютый геморрой.
Сделал лифт в «значение + трассировка», чтобы видеть, как получается результат. Затем лифт в «значение или ошибка», чтобы видеть, что пошло не так. Затем добавил ленивости, чтобы не дёргать альтернативы без нужды.
И вот теперь думаю: если я этот эскиз перетащу в рабочий проект, коллеги меня убьют или похвалят?
А может, ну его нафиг, отдебажу старый добрый код без наворотов? Ну подумаешь, вместо выражений там гора ифов...
Да, самое коварное, что хотел сказать... std::variant недоступен, а boost::variant содержит ошибки!
Он сходит с ума от move semantics. Поэтому пришлось немножко поизвращаться со static_cast...