то кто как парсеры разных структур пишет (чтобы без аллокаций, разумеется)? Хочу одну универсальную функцию T ParsePacket(PacketType type), что делать с типом T?
А что смущает?
по идее, современный подход заключается в том, чтобы не писать руками парсеры. используют protobuf, flatbuf и т.п.
Ну, я хотел бы что-то вроде статичного наследования. Ну, и 30+ это пока сейчас, потом будет больше (больше 255).
нужен общий интерфейс, чтобы пользоваться std::visit удобно, а так впринципе больших проблем не будет
Помню, что у какого-то компилятор было ограничение на количество параметров в 255.
Я предпочитаю парсить данные линейным проходом по документу и по мере нахождения элемента, вызывать соответствующий код, без построения дерева и других временных структур. Про аллокации немного не понял. Это зависит от того, какие данные куда помещать - в уже подготовленные места, или строить объекты во время прохода по документу.
>Про аллокации немного не понял Наиболее очевидный подход с наследованием (struct Base{...}; struct A : Base {...}; struct B : Base {...};) требует сложной и не очень эффективной логики для хранения всех типов наследников на стеке (и может не сработать, если какой-то вариант наследования будет не известен в той TU, где высчитывается размер буффера для вмещения всего).
Хороший подход. Но он подходит, только если формат сериализации проектируется сейчас. То есть не удастся читать protobuf'ом, если там уже лет 10 как не protobuf.
компилироваться может миллион лет, в дебаггере смотреть неудобно будет, DWARF раздует, а в остальном все хорошо
Помнится у vs были проблемы с тем что сигнатура типа очень длинная получается.
Я писал под codegen а-ля protobuf реализацию такого choice. Изначально тоже думал как variant, список типов генерить, но ms сказал упс очень скоро, пришлось пилить просто обёртку над uninitialized storage под max align/size с кучей генерируемых аксессоров. Ну и там ещё мелочи, гарантированный default case типа monostate, часто в таких случаях типы могут быть одинаковые под разными case. Но вообще-то это редкость когда такое удобно, обычно декодирование проще от корня по типу пакета распилить на раздельные функции.
Обсуждают сегодня