170 похожих чатов

Кто может раскрыть тайну "всемирного отказа от dynamic_cast" ?

75 ответов

26 просмотров

Вроде как трудоемкий каст, т.к. выполняет проверки типов

Он довольно редкий гость. Сложно придумать случай, когда его хочеться применить.

dynamic_cast - это маркер плохого ооп, есть двойная диспетчеризация, визитеры

Zlolka-17 Автор вопроса

А если я правильно понимаю - все это делает dynamic_cast, но на стороне компилятора

Zlolka 17
А если я правильно понимаю - все это делает dynami...

Как правило, там, где надо делать даункасты, тип и так известен.

Без rtti он не нужен, а rtti вроде отключают для повышения перфоманса

В смысле всемирного отказа? Это не от каких то практик зависит, а от потребностей проекта.

Технически если код использует большое количество dynamic_cast то он плохо спроектирован и дурно пахнет - используйте правильное проектирование интерфейсов. Также dynamic_cast имеет существенные накладные расходы времени исполнения. В режиме -fno-rtti этот оператор не будет компилироваться.

Если фичей может воспользоваться даже дурак, то только дурак ей и будет пользоваться.

Zlolka-17 Автор вопроса
Int Unsigned
Если фичей может воспользоваться даже дурак, то то...

Шаблоны это тоже фича только для дураков ?

Zlolka-17 Автор вопроса
Евгений Пройдаков
Технически если код использует большое количество ...

Существенные накоадные расходы ? - избегая его мы делаем тоже самое, только "хуже"

Евгений Пройдаков
Технически если код использует большое количество ...

Так а можно какой-то конкретики, какие ошибки могли быть допущены в архитектуре?

Vanya Khodor
Так а можно какой-то конкретики, какие ошибки могл...

Если код выглядит вот так значит скорее всего плохой дизайн: if (auto ptr = dynamic_cast<Pet>(origin)) { … } if (auto ptr = dynamic_cast<Cat>(origing)) { … } if (auto ptr = dynamic_cast<Weapon>(origin))

ㅤㅤㅤㅤㅤ
Бро сделай через switch&case

Время хороших советов от адептов Си? :)

Dmitriy [Отпуск]
Время хороших советов от адептов Си? :)

Та я на плюсах писал ещё когда ты мама говорить не умел

ㅤㅤㅤㅤㅤ
Та я на плюсах писал ещё когда ты мама говорить не...

А я думал, Вы уже вымерли... Вместе с прочими динозаврами. Видимо, дураки вечны

Евгений Пройдаков
Если код выглядит вот так значит скорее всего плох...

Данный код просто на порядок проигрывает в эффективности коду: Origin.QueryIntetface(IID_ICat....) ... и на два порядка коду switch(origin.type) case iiCat: ...

Alexey
И что в нем плохого? Кроме медленного каста

Та вообще пуфик Сделай красивенько тока Типа: 1)🌚👉if… 2)😃🫴🏿if…

Alexey
И что в нем плохого? Кроме медленного каста

Если серьезно, то даже если не брать в учёт всю ту хернь , которая, как я понял, тебе не особо делает погоду, то всё равно быдлокод писать не вариант. Работать-то оно будет, но в таком коде сложнее разобраться…смотреть неприятно. Думаю, ты и сам понимаешь. Крч, суть в том, что это плохая привычка и в будущем, когда над кодом будет работать два+ дядек, то один из дядек может дать в бубен за такое

Int Unsigned
Данный код просто на порядок проигрывает в эффекти...

Зачем спрашивается в язык добавили rtti, если каждый пилит свой?

disba1ancer
Зачем спрашивается в язык добавили rtti, если кажд...

Потому что язык делают люди, которые совершают ошибки, а ошибка в дизайне лечится очень долго и плохо (если поправить через defect report нельзя). Вон std::regex отвратительный получился, и ничего с ним еще не сделали

Alexey
И что в нем плохого? Кроме медленного каста

Ваш код должен быть полностью выразим через интерфейсы и знать конкретные типы наследников вы не должны в пользовательском коде. Ифать код — последнее дело

🐻Alex Fails🦥🏔🍓 ︙
std::regex собираются выбросить

Круто, ну вот отличная иллюстрация, 10+ лет на неудачное решение

А это точно не ошибка дизайна?

Dmitriy [Отпуск]
А это точно не ошибка дизайна?

Да лол почти в любом проекте полно downcast-ов. Это в принципе нормально выдавать интерфейс наружу а внутри работать с имплементацией

Arelav
Да лол почти в любом проекте полно downcast-ов. Эт...

Но вот если для него нужен dynamic_cast то да вероятно с кодом не все в порядке.

Arelav
Да лол почти в любом проекте полно downcast-ов. Эт...

downcast в имплементации обычно не dynamic_cast

Zlolka-17 Автор вопроса
Arelav
Но вот если для него нужен dynamic_cast то да веро...

То есть ты хочешь сказать, что если в коде присутствует массив с общим типом, то это код с которым не все в порядке ?

Zlolka-17 Автор вопроса
Arelav
dynamic cast там не нужен

А как тогда работать с этим ?

Zlolka 17
А как тогда работать с этим ?

variant/интерфейс/type erasure контейнеры как std::functuon?

Zlolka-17 Автор вопроса
Arelav
variant/интерфейс/type erasure контейнеры как std:...

variant ухудшает читаемость, и лёгкость изменения кода

Zlolka-17 Автор вопроса
Arelav
variant/интерфейс/type erasure контейнеры как std:...

Используя интерфейсы мы по-прежнему должы использовать dynamic_cast

Zlolka-17 Автор вопроса
Arelav
variant/интерфейс/type erasure контейнеры как std:...

type erasure внутри себя использует RTTI (typeid)

Zlolka-17 Автор вопроса
Zlolka 17
type erasure внутри себя использует RTTI (typeid)

Да и к тому же - type erasure это "приведение" строго типизированого языка к слабо типизируему - что не есть хорошо

Zlolka 17
Да и к тому же - type erasure это "приведение" стр...

Проблема есть одна со строго типизированными вещами...

Zlolka 17
И что за она ?

Реальные компьютеры не работают со строго типизированными программами. Больше проблем нет.

Zlolka-17 Автор вопроса
Anatoly Shirokov
Почему должны?

Потому что интерфейс это базовый класс, для работы с которым нам необходимо привести его к его наследнику, а это уже задача dynamic_cast

Zlolka-17 Автор вопроса
Zlolka 17
Используя интерфейсы мы по-прежнему должы использо...

Действительно. Если не приводить интерфейсы один к другому, то и не надо dynamic cast

Zlolka 17
Обоснуй

Это ты обоснуй зачем, имея интерфейс нужен dynamic_cast

Zlolka-17 Автор вопроса
Ilya Zviagin
Реальные компьютеры не работают со строго типизиро...

x86 не работает со строго типизированным кодом ?

Zlolka 17
Обоснуй

Дорогой zloyka, я разрешаю вам использовать dynamic_cast по поводу и без.

Zlolka-17 Автор вопроса
Anatoly Shirokov
Это ты обоснуй зачем, имея интерфейс нужен dynamic...

Если те кто реализуют этот интерфейс имеют поля которые не указаны в интерфейсе

Zlolka-17 Автор вопроса
netricks
Дорогой zloyka, я разрешаю вам использовать dynami...

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

Zlolka 17
Если те кто реализуют этот интерфейс имеют поля ко...

Короче, изучай больше с++. Пока ты плаваешь... Причём, это совсем не сложные вещи, не самое непонятное...

Zlolka-17 Автор вопроса
Anatoly Shirokov
Тогда нахрена тебе интерфейс?

Чтобы хранить различные (но схожие) классы в контейнере ?

Zlolka 17
Я его и так использую - я просто хочу понять почем...

Они все идиоты и не лечаться. Очевидно же.

Zlolka-17 Автор вопроса
Zlolka 17
Чтобы хранить различные (но схожие) классы в конте...

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

Ilya Zviagin
В ООП.

Мне кажется, этого термина нет в с++.

netricks
Мне кажется, этого термина нет в с++.

Ну... Может в стандарте и нет.

Zlolka-17 Автор вопроса

https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAZgQDbYB2AhgLbYgDkAjF%2BTXRMiAZVQtGIHgBYBQogFUAztgAKAD24AGfgCsp5eiyahUAUgBMAIUtXyKxqiIEh1ZpgDC6egFc2TEAsATnJ3ABkCJmwAOT8AI2xSEAAOcgAHdCViFyYvX39AkIys5yEIqNi2BKTUh2wnHJEiFlIiPL8A4PtsR1KmJpaicpj4xJT7Ztb2gq6lSaHIkaqx5IBKe3QfUlROLgB6PYBqABUATzTsQ9PN0kOMHEOkROxyQ7JD%2BnQWTEPjQ%2Bx1Ow0owAHRmLQAQXBUIsAGZIqhfA8zLCPAA3CQtUgsU4o3DQyzwpiInzI1Fo%2BokUh4gmQxEsJRKQ5WBnYESnObYNhmADsNkhaR8cXoBFQIGhh0lhzRBFaPgk0vQBB%2BPjSmBYRGwEFWvJsPIAIij%2BVCDUbaRD6YzDqokBzRezOWwQIdBcLRczWQ7Ndy%2BdDXSKxRKpWilSq1Rqtas3hTSKRldhdUGpVKABq2dOwqyHACa6esZshyd5hsLUsiREOKdeuczBNNtch0MtTJEmyYmC9XOd/vdLJUnZ9xp7gdLkpDysOqvVmu10cScZwidHycOSjbPwz%2BsOPALEKLpuXc0wIBAGKMsZxKI85bxq/Xu%2BLD8h5cObBYkW1S73UqPJ4pTjIK8%2BzZDlvQAKlvJRQK5JQvxXKUogAd2tW0slQAdP2XZNyCQw5Wx8dsMJ1ZdHwbb9JUEUgIBYHwSDAw44lZAB9KDHWdVjvSUHVfSwssaGo2j0HotJUNFFjoLYQ4US3TBTlYNgxPEOYrxtO10IkiDYVwCBGJUcTHVWbjjXg%2BCRLU/TvQAWjxFMpNhLcAFZdxMlczLQiyuWsrTszsrcgmckzi3%2BegVEOAgaEOAS6LvAjMA8yTpMOWT5MUhkiCvfDCI0vEdOYjiuUMuCXJ/dd4q83A11i3ypL5HhXgsV5YVeaRSOMwKD3IlddOwMq8SnCNPzI/cSxNEauHWehuAc/gAi4HRyHQbgPDzLNKu2S5CT4cgiG0cb1gAaxABytEMbhpBm3aFu4fglBAE6drm8byDgWAUAwNg0gYRJKGod7PsYJJgB4HgmroehNVIW6dMuuJIhaU5uC296OGEAB5Jh6ARx7yBwN8TEkbHCFISkCApW7sYBepaN2Lbyx6S6RTibFSFOLwcEuog4ydXgnpoIxgCUAA1AhsEQ1GLlmrbBGEMQJE4GQ5GEZQ1E0bH9DqowTDQFbDAIOJbsgdZ0DSPpycs1HYRunoSdcCB3GmAI6vCRZKmqAximyIQHfdzJPaYYZXbGOq6gaIQBimbwOgMEO%2BnDhYKlGJJg/mb3k8GAPE6kdY1p2AxOewGmnsmrhppwy7Fq4dRkgANks6vpEOYBUFQbceBBWFIuW/NrFefBiHeTbXi8D6vtuTbVn4B6dEM8hDuO06uHOsvsYrm67u23aZ%2BLix%2BCdHk260avYWSYIeWSHk4WkLRZFm%2BbV43x71he5AQE2IhBSIH6ID%2B0fonYXYq613ro3Zurd278GwIQKkyoDDS1EOISQCs4HKw0JddW5BELYjSIjIuU0Lor24KjWiH83gRUAXXBuTcW7A3bp3dAI8AZSThDwCeD9p7rCeN8MY2oF5LydBYZIIIgiwmrjwHkWgLA8AsDyauDkggOQcsvO%2B117DrynntBelslH8HvuomeMYsiuGkEAA

Zlolka-17 Автор вопроса

В каком из трех принципов ООП я плаваю ?

Zlolka 17
https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFF...

Ну вот это пример плохого дизайна. Читай о визитерах, например и т.п. это немасштабируемое решение. О SOLID почитайте еще

Zlolka 17
В каком из трех принципов ООП я плаваю ?

В ООП есть три принципа? Это как три закона Ньютона?

Zlolka-17 Автор вопроса
Anatoly Shirokov
Ну вот это пример плохого дизайна. Читай о визитер...

Согласен - визитор здесь будет более выгоден чем dynamic_cast

netricks
В ООП есть три принципа? Это как три закона Ньютон...

давай проще. Есть 1 принцип: полиморфизм подтипов. То есть, виртуальные функции с наследованием состояния

underrated like a psychopath
давай проще. Есть 1 принцип: полиморфизм подтипов....

... наш преподаватель по теоретической механике говорил "вы незнаете кинематики" всякий раз, когда студент начинал нести какую-то пургу. Полиморфизм вообще не является образующей особенностью ООП.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта