Можно ли написать общий оптимальный конструктор при наличии доступа ко всем полям? (десериализация)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Можно ли написать общий оптимальный конструктор при наличии доступа ко всем полям? (десериализация)

Сообщение 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 :: Необязательно для некоторых типов столбцов. Придется ли мне ждать размышления, чтобы сделать это наиболее эффективным?

Подробнее здесь: https://stackoverflow.com/questions/795 ... ess-to-all
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»