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

Привет всем. std::variant с 30+ типами - норм? Если нет,

то кто как парсеры разных структур пишет (чтобы без аллокаций, разумеется)? Хочу одну универсальную функцию T ParsePacket(PacketType type), что делать с типом T?

11 ответов

25 просмотров

А что смущает?

по идее, современный подход заключается в том, чтобы не писать руками парсеры. используют protobuf, flatbuf и т.п.

LaG1924- Автор вопроса
Andrew Revvo
А что смущает?

Ну, я хотел бы что-то вроде статичного наследования. Ну, и 30+ это пока сейчас, потом будет больше (больше 255).

нужен общий интерфейс, чтобы пользоваться std::visit удобно, а так впринципе больших проблем не будет

LaG1924- Автор вопроса
LaG1924
Ну, я хотел бы что-то вроде статичного наследовани...

Помню, что у какого-то компилятор было ограничение на количество параметров в 255.

LaG1924
Ну, я хотел бы что-то вроде статичного наследовани...

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

LaG1924- Автор вопроса
Andrew Revvo
Я предпочитаю парсить данные линейным проходом по ...

>Про аллокации немного не понял Наиболее очевидный подход с наследованием (struct Base{...}; struct A : Base {...}; struct B : Base {...};) требует сложной и не очень эффективной логики для хранения всех типов наследников на стеке (и может не сработать, если какой-то вариант наследования будет не известен в той TU, где высчитывается размер буффера для вмещения всего).

LaG1924- Автор вопроса
Anatoly Shirokov
по идее, современный подход заключается в том, что...

Хороший подход. Но он подходит, только если формат сериализации проектируется сейчас. То есть не удастся читать protobuf'ом, если там уже лет 10 как не protobuf.

компилироваться может миллион лет, в дебаггере смотреть неудобно будет, DWARF раздует, а в остальном все хорошо

Помнится у vs были проблемы с тем что сигнатура типа очень длинная получается.

Dmitry Sokolov
Помнится у vs были проблемы с тем что сигнатура ти...

Я писал под codegen а-ля protobuf реализацию такого choice. Изначально тоже думал как variant, список типов генерить, но ms сказал упс очень скоро, пришлось пилить просто обёртку над uninitialized storage под max align/size с кучей генерируемых аксессоров. Ну и там ещё мелочи, гарантированный default case типа monostate, часто в таких случаях типы могут быть одинаковые под разными case. Но вообще-то это редкость когда такое удобно, обычно декодирование проще от корня по типу пакета распилить на раздельные функции.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта