Size: a a a

2021 February 04

MK

Mikhail Kalugin in pro.cxx
откуда берется vtkRemotingClientStreamModule.h??? (крик отчаяния)
источник

AN

Alexander N in pro.cxx
Uyutnov Kirill
Но учить новые стандарты и саморазвиаваться это одно, а с какого стандарта сейчас начинать изучать плюсы это все же другое. К тому же, человека изучающего 11 и 14 более старым синтаксисом не удивишь - ему будет понятно, что писали олды )
Особенно если им придётся это поддерживать
источник

DK

Dmitry Khominich in pro.cxx
Как сделать специализацию нескольких функций шаблонного класса, которые должны иметь другую сигнатуру для специализированных типов.
Пример:
https://godbolt.org/z/h1T1nf
хочу для T = void, чтобы value() возвращали void и только кидались исключанием
источник

AF

Aidar Fattakhov in pro.cxx
никак
источник

О

Олег in pro.cxx
А какое должно быть поведение для случая opt_value<void> voidopt ? Там у тебя переменная объявлена типа T) и что будет если использовать как T void
Думаю тебе нужна ещё одна специализация класса, а не функций для случая void чтобы были ошибки на этапе компиляции если кто-то его пытается использовать.
источник

DK

Dmitry Khominich in pro.cxx
Олег
А какое должно быть поведение для случая opt_value<void> voidopt ? Там у тебя переменная объявлена типа T) и что будет если использовать как T void
Думаю тебе нужна ещё одна специализация класса, а не функций для случая void чтобы были ошибки на этапе компиляции если кто-то его пытается использовать.
Да, не удачный пример. Но давай представим что T _v; может быть инстанциирован от void. типа some_class<T> _v;

Специализацию всего класса делать не хочется, т.к. придется копи-пастить другие методы класса, которые не меняются от специализации.
источник

АК

Александр Караев... in pro.cxx
С T _v{} придётся чуть заморочиться на трейтах, а вот методы легко:

void value() const requires std::same_as<T, void> { throw ... }
const T& value() const requires (!std::same_as<T, void>) { return ... }
источник

m

magras in pro.cxx
Dmitry Khominich
Да, не удачный пример. Но давай представим что T _v; может быть инстанциирован от void. типа some_class<T> _v;

Специализацию всего класса делать не хочется, т.к. придется копи-пастить другие методы класса, которые не меняются от специализации.
Общий код выносят в базовый класс, отличающийся код в специализации. Я не фанат наследования реализации, но кажется это самый адекватный вариант.
источник

DK

Dmitry Khominich in pro.cxx
magras
Общий код выносят в базовый класс, отличающийся код в специализации. Я не фанат наследования реализации, но кажется это самый адекватный вариант.
Норм вариант, спасибо.
источник

DK

Dmitry Khominich in pro.cxx
Александр Караев
С T _v{} придётся чуть заморочиться на трейтах, а вот методы легко:

void value() const requires std::same_as<T, void> { throw ... }
const T& value() const requires (!std::same_as<T, void>) { return ... }
Отличный C++20 вариант! спасибо. Правда придется возвращаемое значение на auto заменить, иначе компилятор ругается не дойдя еще до токена requires
источник

AF

Aidar Fattakhov in pro.cxx
Александр Караев
С T _v{} придётся чуть заморочиться на трейтах, а вот методы легко:

void value() const requires std::same_as<T, void> { throw ... }
const T& value() const requires (!std::same_as<T, void>) { return ... }
там есть add_lvalue_reference
источник

AF

Aidar Fattakhov in pro.cxx
но от T _v это не спасет
источник

MK

Mikhail Kalugin in pro.cxx
А если бы там было T *_v? Вообще, похоже на нарушение SOLID - если оно какой-то вид варианта - зачем там void? А если оно делает еще-что то, кроме хранения состояния, то лучше это вынести в отдельный класс.
источник

AF

Aidar Fattakhov in pro.cxx
Mikhail Kalugin
А если бы там было T *_v? Вообще, похоже на нарушение SOLID - если оно какой-то вид варианта - зачем там void? А если оно делает еще-что то, кроме хранения состояния, то лучше это вынести в отдельный класс.
это скорее std::future похоже чем вариант
источник

АК

Александр Караев... in pro.cxx
Mikhail Kalugin
А если бы там было T *_v? Вообще, похоже на нарушение SOLID - если оно какой-то вид варианта - зачем там void? А если оно делает еще-что то, кроме хранения состояния, то лучше это вынести в отдельный класс.
optional<void> - вполне разумный случай для шаблонного кода, просто почему-то никто не считает void юнит-типом
источник

DK

Dmitry Khominich in pro.cxx
Mikhail Kalugin
А если бы там было T *_v? Вообще, похоже на нарушение SOLID - если оно какой-то вид варианта - зачем там void? А если оно делает еще-что то, кроме хранения состояния, то лучше это вынести в отдельный класс.
Я делаю тип, как в расте Result<T, E>. Чтобы для Result<void, E> работало только для бросания ошибки. Пример в годболе накидал для начала обсуждения
источник

AF

Aidar Fattakhov in pro.cxx
да и какой нахрен солид в 2021, как там с Барбара Лисков поживает?
источник

AF

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

MK

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

MK

Mikhail Kalugin in pro.cxx
Dmitry Khominich
Я делаю тип, как в расте Result<T, E>. Чтобы для Result<void, E> работало только для бросания ошибки. Пример в годболе накидал для начала обсуждения
А... Монада Either... Понял, правда, пока так сразу не могу сообразить как сделать..
источник