Size: a a a

2020 October 11

D

Danya in pro.cxx
источник

AK

Andrei K in pro.cxx
Arelav
Если можно как написано выше, то можно и reinterpret https://en.cppreference.com/w/cpp/language/reinterpret_cast пункт 5, правда насчёт разыменования вопрос
Ты полностью пропускаешь мой поинт...
источник

AK

Andrei K in pro.cxx
Можно и си-кастом.
источник

AK

Andrei K in pro.cxx
Но не нужно.
источник

DV

Denis Vorkozhokov in pro.cxx
Andrei K
Ты полностью пропускаешь мой поинт...
Я правильно понимаю, что твой поинт, что такой каст корректен в этом случае, но в других случаях его не стоит юзать и поэтому лучше всегда юзать то, как ты предложил?
источник

AK

Andrei K in pro.cxx
Denis Vorkozhokov
Я правильно понимаю, что твой поинт, что такой каст корректен в этом случае, но в других случаях его не стоит юзать и поэтому лучше всегда юзать то, как ты предложил?
Почти. Я не думаю, что он корректен. Работает =/= корректен. Там могут быть какие-то чудовищно странные пункты стандарта, что сработает Hyrum’s law и будет какой-нибудь компилятор, который всё сломает.
источник

AK

Andrei K in pro.cxx
Безопасный даункаст делается через static_cast, энд оф стори.
источник

m

magras in pro.cxx
Andrei K
Безопасный даункаст делается через static_cast, энд оф стори.
А разве каст void* -> T* - это даункаст?
источник

AK

Andrei K in pro.cxx
Даункаст — это не термин из стандарта. Поэтому я не уверен, что на это стоит завязываться.
источник

AK

Andrei K in pro.cxx
Но идея в целом, что типы преобразовывать надо через статик_каст
источник

m

magras in pro.cxx
Andrei K
Даункаст — это не термин из стандарта. Поэтому я не уверен, что на это стоит завязываться.
Если я правильно понял этот пункт, static_cast может изменить значение указателя только если было нарушено выравнивание. Здесь я говорю только о касте void* -> T*.
источник

m

magras in pro.cxx
Но да, я с ходу не вижу зачем там был лишний уровень индерекции, а без него конечно лучше статиком пользоваться.
источник

К

Коля🤔🎭 in pro.cxx
magras
Если я правильно понял этот пункт, static_cast может изменить значение указателя только если было нарушено выравнивание. Здесь я говорю только о касте void* -> T*.
reinterpret_cast?
источник

m

magras in pro.cxx
magras
Но да, я с ходу не вижу зачем там был лишний уровень индерекции, а без него конечно лучше статиком пользоваться.
На самом деле скорее всего правильный ответ вообще заключается в использовании placement new, но без контекста сложно что-либо утверждать.
источник

m

magras in pro.cxx
Коля🤔🎭
reinterpret_cast?
Я не понял вопроса.
источник

К

Коля🤔🎭 in pro.cxx
magras
Я не понял вопроса.
Говорю, может стоит использовать reinterpret_cast для таких целей?
источник

m

magras in pro.cxx
Коля🤔🎭
Говорю, может стоит использовать reinterpret_cast для таких целей?
reinterpret_cast почти всегда плохая идея, в этом я согласен с @AndreiKei. Я спорил только с техническими мелочами.

Более того, reinterpret_cast очень редко бывает нужен. С ходу я могу назвать только одно разумное применение intptr_t <-> T*.
источник

P

PRoSToC0der in pro.cxx
magras
reinterpret_cast почти всегда плохая идея, в этом я согласен с @AndreiKei. Я спорил только с техническими мелочами.

Более того, reinterpret_cast очень редко бывает нужен. С ходу я могу назвать только одно разумное применение intptr_t <-> T*.
кстати, std::bit_cast все кейсы reinterpret_cast закрывает?
источник

m

magras in pro.cxx
magras
reinterpret_cast почти всегда плохая идея, в этом я согласен с @AndreiKei. Я спорил только с техническими мелочами.

Более того, reinterpret_cast очень редко бывает нужен. С ходу я могу назвать только одно разумное применение intptr_t <-> T*.
Опять туплю. Еще конечно T* <-> char* и аналогичные типы.
источник

OS

Oleksandr Senkovych in pro.cxx
Поцоны, вопрос по дизайну и архитектуре. У приложения есть большая функция с кучей проверок на то что входящие данные валидны. Проходит какое-то время и нужно написать вторую функцию, которая делает на 90% то же самое что и первая но немного иначе. Проходит еще время - нужно расширить еще в другом месте. Как правильно сделать архитектуру для этого? Вот несколько вариантов которые мне кажутся не оч.
1. Добавить больше аргументов. Мне не нравится потому что много аргументов будут  релевантны только в одном частном случае и бойлерплейтом в других.
2. Разбить на мелкие функции и вместо условного validate(args...) вызывать validateA(aArgs...) && vallidateB(bArgs...) && validateC(cArgs...). Минусом я вижу что если появится нужда для validateD(dArgs...) в будущем то нужно будет его добавлять во множестве разных мест.

может какой-то policy-based здесь подойдет?
источник