У меня есть код сериализации, чтобы сохранить объект в БД. Это работает путем отображения значения перечисления, представляя столбец, члену класса. Информация о типе сохраняется таким образом, поэтому я знаю, как написать каплей. < /P>
// maps each field to a column based on the DbColumns enum - returns a reference to the field that represents the column
template
auto& GetColumn()
{
using enum DbColumns;
if constexpr(Column == timestamp) return _timestamp;
if constexpr(Column == id) return _id;
}
< /code>
Я надеюсь, что я также смогу использовать это, чтобы десериализировать каплей обратно в объект - мне не нужно было бы вручную писать конструктор, который берет n столбцов, и должен проверять и записать каждый базовый тип (может быть 10+ столбцов). В процессе десериализации я знаю, какой столбец я читаю в то время и, следовательно, его тип. Так что я могу просто позвонить в getColumn () и назначить его новое значение. Проблема состоит в том, что объект должен быть построен по умолчанию, а затем каждое поля назначено. Это в конечном итоге по умолчанию инициализации каждого члена, только для того, чтобы немедленно перезаписать их значением. Я надеялся, что выполнение этого способа позволит компилятору увидеть, что инициализированное значение по умолчанию никогда не читается, и, таким образом, может полностью пропустить его, но это не так (см. Пример ниже). < /P>
// Ideal style ctor - this is basically copy/paste for all DbRecord types, independent of number of fields,
// all types are inferred by return type of GetColumn(), no changes needed if columns are added/removed.
// But this requires all fields to be default-initialized and then immediately overwritten.
template
DbRecord(std::index_sequence, Args&&... args)
{
// fold expression to call GetColumn() on each argument, assigning each column
((GetColumn() = std::move(args)), ...);
}
< /code>
Есть ли что -то еще, что я могу здесь сделать, чтобы «генерировать» CTOR с списком инициализаторов? В этом упрощенном примере Explorer Explorer вы можете увидеть сборку, созданную с помощью этого подхода против «идеального», с списком инициализаторов: https://godbolt.org/z/9egy93qz9 - Clang генерирует 2x сборку (я не говорю, что код будет выполнять 2x инструкции - я думаю, что это будет так, как это будет, так что это будет, так что это будет настолько. Невозможно быть непустым). Это оставляет инициализированное состояние по умолчанию дешевле, а перезапись не так дорого. Но он тратит небольшое количество места, все еще дороже, чем идеальный CTTO, и требует, чтобы все типы D -Brecord знали и использовали STD :: Необязательно для некоторых типов столбцов. Придется ли мне ждать размышления, чтобы сделать это наиболее эффективным?
Подробнее здесь: https://stackoverflow.com/questions/795 ... ess-to-all
Можно ли написать общий оптимальный конструктор при наличии доступа ко всем полям? (десериализация) ⇐ C++
Программы на C++. Форум разработчиков
1745852417
Anonymous
У меня есть код сериализации, чтобы сохранить объект в БД. Это работает путем отображения значения перечисления, представляя столбец, члену класса. Информация о типе сохраняется таким образом, поэтому я знаю, как написать каплей. < /P>
// maps each field to a column based on the DbColumns enum - returns a reference to the field that represents the column
template
auto& GetColumn()
{
using enum DbColumns;
if constexpr(Column == timestamp) return _timestamp;
if constexpr(Column == id) return _id;
}
< /code>
Я надеюсь, что я также смогу использовать это, чтобы десериализировать каплей обратно в объект - мне не нужно было бы вручную писать конструктор, который берет n столбцов, и должен проверять и записать каждый базовый тип (может быть 10+ столбцов). В процессе десериализации я знаю, какой столбец я читаю в то время и, следовательно, его тип. Так что я могу просто позвонить в getColumn () и назначить его новое значение. Проблема состоит в том, что объект должен быть построен по умолчанию, а затем каждое поля назначено. Это в конечном итоге по умолчанию инициализации каждого члена, только для того, чтобы немедленно перезаписать их значением. Я надеялся, что выполнение этого способа позволит компилятору увидеть, что инициализированное значение по умолчанию никогда не читается, и, таким образом, может полностью пропустить его, но это не так (см. Пример ниже). < /P>
// Ideal style ctor - this is basically copy/paste for all DbRecord types, independent of number of fields,
// all types are inferred by return type of GetColumn(), no changes needed if columns are added/removed.
// But this requires all fields to be default-initialized and then immediately overwritten.
template
DbRecord(std::index_sequence, Args&&... args)
{
// fold expression to call GetColumn() on each argument, assigning each column
((GetColumn() = std::move(args)), ...);
}
< /code>
Есть ли что -то еще, что я могу здесь сделать, чтобы «генерировать» CTOR с списком инициализаторов? В этом упрощенном примере Explorer Explorer вы можете увидеть сборку, созданную с помощью этого подхода против «идеального», с списком инициализаторов: https://godbolt.org/z/9egy93qz9 - Clang генерирует 2x сборку (я не говорю, что код будет выполнять 2x инструкции - я думаю, что это будет так, как это будет, так что это будет, так что это будет настолько. Невозможно быть непустым). Это оставляет инициализированное состояние по умолчанию дешевле, а перезапись не так дорого. Но он тратит небольшое количество места, все еще дороже, чем идеальный CTTO, и требует, чтобы все типы D -Brecord знали и использовали STD :: Необязательно для некоторых типов столбцов. Придется ли мне ждать размышления, чтобы сделать это наиболее эффективным?
Подробнее здесь: [url]https://stackoverflow.com/questions/79595594/is-it-possible-to-write-a-generic-optimal-constructor-when-having-access-to-all[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия