Size: a a a

2021 February 04

AF

Aidar Fattakhov in pro.cxx
Mikhail Kalugin
В данном случае - компилятор с вами не согласен. Не может переменная иметь тип void - эта часть как раз из того времени, когда принцип был еще живой.
и не должна, причем тут она?
источник

AF

Aidar Fattakhov in pro.cxx
Mikhail Kalugin
А... Монада Either... Понял, правда, пока так сразу не могу сообразить как сделать..
монада either только не монада
источник

DK

Dmitry Khominich in pro.cxx
В общем C++20 рулит. Спасибо @smertig :


   void value() const requires std::is_same_v<T, void>  { ... }

   auto value() requires (!std::is_same_v<T, void>) { ... }

   auto value() const requires (!std::is_same_v<T, void>) { ... }
источник

MK

Mikhail Kalugin in pro.cxx
Aidar Fattakhov
и не должна, причем тут она?
Притом, что оно пытается хранить состояние (и это нормальное поведение для Either - оно просто там может быть - или состояние или ошибка, в общем обычный union-тип), но тут неожиданно пользователь хочет там void - чтобы была только ошибка. Мы делаем две вещи в одном, и вот прямо так это не сделать.
источник

АК

Александр Караев... in pro.cxx
Dmitry Khominich
В общем C++20 рулит. Спасибо @smertig :


   void value() const requires std::is_same_v<T, void>  { ... }

   auto value() requires (!std::is_same_v<T, void>) { ... }

   auto value() const requires (!std::is_same_v<T, void>) { ... }
главное убедиться, что auto value() ссылку вернёт, а не значение
источник

AS

Artur Solovev in pro.cxx
Aidar Fattakhov
принцип подстановки барбары лисков умер гдето в 90-х короче
Офигительная история
источник

AF

Aidar Fattakhov in pro.cxx
Artur Solovev
Офигительная история
там в какойто книжке или саттер или александреску или еще кто пытаются натянуть принцип барбары лисков на просто недублирование кода
источник

AS

Artur Solovev in pro.cxx
Ну да, если можно спроектировать классы так, что общий функционал реализован через вызовы базового класса, и запретить наследникам его ломать, чтобы не писать его по новой, это же отличная идея
источник

D

Dmitriy in pro.cxx
Если возвращается ссылка, можно использовать add_lvalue_reference<T>
источник

D

Dmitriy in pro.cxx
Емнип, у этого трейта есть специализация для void
источник

D

Dmitriy in pro.cxx
add_lvalue_reference<void> -> void
add_lvalue_reference<Ty> -> Ty&
источник

DK

Dmitry Khominich in pro.cxx
Dmitriy
Емнип, у этого трейта есть специализация для void
Спасибо! Да есть. Обновленный результат:


   void value() const requires std::is_same_v<T, void>  { ... }

   std::add_lvalue_reference_t<T> value() requires (!std::is_same_v<T, void>) { ... }

   std::add_lvalue_reference_t<const T> value() const requires (!std::is_same_v<T, void>) { ... }


Страшновато выглядит, но со своей задачей справляется.
источник

АК

Александр Караев... in pro.cxx
Dmitry Khominich
Спасибо! Да есть. Обновленный результат:


   void value() const requires std::is_same_v<T, void>  { ... }

   std::add_lvalue_reference_t<T> value() requires (!std::is_same_v<T, void>) { ... }

   std::add_lvalue_reference_t<const T> value() const requires (!std::is_same_v<T, void>) { ... }


Страшновато выглядит, но со своей задачей справляется.
кстати, это всё решается и в C++17 через if constexpr внутри метода с auto возвращаемым значением.
правда отключить void value() non-const не получится таким образом
источник

AS

Artur Solovev in pro.cxx
Получится, static_assert'ом на !is_same_v
источник

АК

Александр Караев... in pro.cxx
Artur Solovev
Получится, static_assert'ом на !is_same_v
нет, потому что тело такого метода инстанцируется не при вызове, а при инстанцировании объекта
источник

AS

Artur Solovev in pro.cxx
Не понял?
источник

DK

Dmitry Khominich in pro.cxx
Александр Караев
кстати, это всё решается и в C++17 через if constexpr внутри метода с auto возвращаемым значением.
правда отключить void value() non-const не получится таким образом
if constexpr работает только для шаблонных параметров функции. От шаблонных параметров класса - это будет обычный if.
источник

D

Dmitriy in pro.cxx
Dmitry Khominich
Спасибо! Да есть. Обновленный результат:


   void value() const requires std::is_same_v<T, void>  { ... }

   std::add_lvalue_reference_t<T> value() requires (!std::is_same_v<T, void>) { ... }

   std::add_lvalue_reference_t<const T> value() const requires (!std::is_same_v<T, void>) { ... }


Страшновато выглядит, но со своей задачей справляется.
Первый можно убрать
источник

D

Dmitriy in pro.cxx
Requires тоже лишние
источник

АК

Александр Караев... in pro.cxx
Александр Караев
нет, потому что тело такого метода инстанцируется не при вызове, а при инстанцировании объекта
прошу прощения, это ложь
источник