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

Поэтому мой всем совет. Встречаете убийцу C++: подходите и задаёте

ТРИ ГЛАВНЫХ вопроса

(1) typeid
(2) ошибки в конструкторах
(3) делегация сестринскому типу

Всё. Дальше всё ясно сразу. Люди выкручиваются, ссылаются на бедный LLVM, предлагают аборт, людей корёжит. Почему? Потому что это настоящие проблемы. И настоящие недостатки C++. И красивого решения я тут не видел нигде ни разу. Либо отказ от самой концепции (что сразу проигрыш) либо аборт.

60 ответов

17 просмотров

А что такое (3)?

Konstantin-Vladimirov Автор вопроса

Я выше ответил: при виртуальном наследовании dynamic cast к сестринскому типу и вызов там метода. Очень интересная проблема. Очень криво решена в C++. Никак (вообще НИКАК) не решена нигде кроме C++.

Konstantin Vladimirov
Я выше ответил: при виртуальном наследовании dynam...

Понятно. А вам доводилось встречаться в своей практике с виртуальным наследованием?

Konstantin-Vladimirov Автор вопроса
Alexey Egorov
Понятно. А вам доводилось встречаться в своей прак...

Да конечно. Вам тоже. Вы хотя бы раз писали cout << "Hello world"? Вот. Это оно =)

Konstantin Vladimirov
Да конечно. Вам тоже. Вы хотя бы раз писали cout <...

Вот сейчас не понял. Каким образом это оно?

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

Konstantin-Vladimirov Автор вопроса
Alexey Egorov
Вот сейчас не понял. Каким образом это оно?

Там ромбовидное наследование. Виртуальное наследование как раз и нужно чтобы ромбовидное наследование работало как положено.

Konstantin-Vladimirov Автор вопроса
Alexander B. Babayants
Ну это академический взгляд на вещи. А для индустр...

Это ошибка. Для индустрии важна фильтрация дураков на ранних подступах. Но с этим и C справляется.

Konstantin Vladimirov
Там ромбовидное наследование. Виртуальное наследов...

А где оно? Если честно, я всё ещё не понимаю, хотя иерархию наследования вроде бы представил.

Sergey Kaniskin
в std::ostream

адский дизайн из 90х, хорошо, что сегодня так не делают

Konstantin-Vladimirov Автор вопроса

«Ошибки в конструкторах» это какая-то дичь, не должны конструкторы быть настолько пробздетыми. Помню был у нас товарищ, который в конструкторе делал HTTP-запрос, но ему быстро настучали по тыкве

Konstantin-Vladimirov Автор вопроса
Evgeny Sh.
«Ошибки в конструкторах» это какая-то дичь, не дол...

Конструкторы часто выделяют память, память это конченый ресурс. Ошибки там неизбежны.

Konstantin Vladimirov
Да конечно. Вам тоже. Вы хотя бы раз писали cout <...

Ага худший способ вывода, который сделан настолько убого что потребовал имплементации с виртуальным наследованием, по вашем формат и его аналоги на ровном месте появились? В общем довольно слабая аргументация

Pavel Perekhozhikh
Там точно оно есть?

Да https://github.com/llvm/llvm-project/blob/main/libcxx/include/istream#L180

Arelav
Да https://github.com/llvm/llvm-project/blob/main/...

Ты на стандарт укажи а не имплиментацию

Arelav
Эм речь про имплементацию

Эм, выйдет новый llvm и не будет

Pavel Perekhozhikh
Эм, выйдет новый llvm и не будет

Угу за 30 лет не вышел что то

Pavel Perekhozhikh
Кого? Ллвм?

У всех реализаций

Konstantin-Vladimirov Автор вопроса
Arelav
Ага худший способ вывода, который сделан настолько...

iostream отличный способ вывода так как позволяет легко переопределить вывод для пользовательских классов. Он несравнимо лучше printf и любых аналогов в любых других языках. Просто небо и земля. Если вы этого не понимаете, то в общем разговаривать не о чем. boost::format появился на базе iostream как забавные вариации на тему. Широкого распространения не получил.

Konstantin Vladimirov
iostream отличный способ вывода так как позволяет ...

fmt format с некоторыми изменениями принят в стандарт

Konstantin Vladimirov
iostream отличный способ вывода так как позволяет ...

Тут стоило бы задуматься, iostream – это способ вывода или способ форматирования? И уже в этом вопросе видно невооружённым взглядом проблему. Он бросается решать больше, чем одну проблему и решает их все одинаково. Одинаково плохо

Arelav
fmt format с некоторыми изменениями принят в станд...

В absl есть Substitute, в folly Format, в бусте реализация довольно плохая. По поводу юзер типов не вижу проблемы https://fmt.dev/latest/api.html#formatting-user-defined-types

Ofee Oficsu
Тут стоило бы задуматься, iostream – это способ вы...

я кстати не вижу ничего плохого в printf, более того, многие компиляторы умеют его статически проверять

usernameak
я кстати не вижу ничего плохого в printf, более то...

Разнаная размерность типов на платформах

Pavel Perekhozhikh
Разнаная размерность типов на платформах

а где это конкретно создаёт проблему?

Konstantin-Vladimirov Автор вопроса
Ofee Oficsu
Тут стоило бы задуматься, iostream – это способ вы...

За вас задумались. Там сверхгениальное разделение на буфер отвечающий за вывод и поток отвечающий за форматирование.

usernameak
я кстати не вижу ничего плохого в printf, более то...

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

Konstantin Vladimirov
За вас задумались. Там сверхгениальное разделение ...

Угу иначе как сверхгениальным и не назовешь

Arelav
Принтф довольно неплох, но довольно неудобно указы...

жаль что в плюсах нет такого принтф как в D

usernameak
а где это конкретно создаёт проблему?

Ты берёшь либу где писали под 32 и компилишь как 64, или наоборот

usernameak
не юзай %ld и не страдай

:) я бы тебя расцеловал, еслиб ты работал с легаси

Pavel Perekhozhikh
Лонги тут при чем?

а какой ещё тип имеет такую проблему?

usernameak
не юзай %ld и не страдай

Главная проблема что на разных ос может либо лонг разного размера быть, либо тайпдефы испольщуют разные типы

int_fast_32_t x = 5; printf("???", x);

где ты в легаси такие типы видел?

usernameak
а какой ещё тип имеет такую проблему?

На android чар, вот прям разное поведение при переполнении

Pavel Perekhozhikh
На android чар, вот прям разное поведение при пере...

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

Dima
Что за легаси ?

любой старый как труха код

Alexey Egorov
Понятно. А вам доводилось встречаться в своей прак...

это неизбежные издержки множественного наследования. А от него отказываться не хочется, очень сильная вещь

Arelav
Угу иначе как сверхгениальным и не назовешь

ну если рассматривать iostream как вещь, где скорость неособо важна, а удобство нужно - он действительно хорош. И добавлять пользовательские типы даже легче чем с std::format(там явно что-то не доглядели в этом плане) Но скорость у стримов страдает и они правда пытаются решить слишком много проблем. И напрягает что добавляют новые стримы(spanstream например) вместо того чтобы как-то переделать концепцию, чтобы убрать виртуальные функции и наследование (повысить производительность)

Kelbon
ну если рассматривать iostream как вещь, где скоро...

Ну и проблема перфа стримов концептуальная Смотри по своей сути format это конкатенация н строк А stream это аппенд н строк Второе by design делает log n аллокация вместо 1

Kelbon
ну если рассматривать iostream как вещь, где скоро...

По поводу того что user defined для стримов удобнее чем для формата я в целом согласен, но я предпочитаю ToString метод

Kelbon
там буфер так что это даже лучше

Мне кажется не корректно сравнивать format и cout, логичнее со stringstream. Или cout с print Ну и в случае format или stringstream речь как раз о кейсе который я описал

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
11
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
Can I forward ports (including the SSH port) between two machines without SSH? I know I can forward SSH server port from machine A (which blocks all requests by firewall) to ...
required optional
5
Всем вечера. Подскажите как лучше сделать. делаю на Д10 Например будет база данных на SQLite. в ней будет много таблиц. более 50шт Типа справочник. Содержать ID Name Id p...
Андрей Т 🐎
10
Карта сайта