#pragma once #include template struct Column { Column(T default_value): value{default_value} {} Column(): value{} {} void clear() { this->value = {}; } using real_type = T; T value{}; }; template struct UnclearableColumn: public Column { using Column::Column; void clear() { } }; struct ForeignKey: Column { static constexpr auto name = "fk_"; }; struct Id: UnclearableColumn { static constexpr std::size_t unset_value = static_cast(-1); static constexpr auto name = "id_"; static constexpr auto options = "PRIMARY KEY"; Id(): UnclearableColumn(unset_value) {} };