Добрый день.
Есть ли какая-то возможность сделать так(метакод):
// header
class A
{
public:
void Copy(const A& a);
private:
// meta-code: want to copy this in Copy method
int iVal_{};
// just ptr, do nothing
float* fPtr_{};
};
// body
void A::Copy(const A& a)
{
iVal_ = a.iVal_; // i got this code, ok!
//fPtr_ = a.fPtr_; - no code, i don't ask for it
}
Пояснения: у меня что-то типа базы данных. Есть класс, который читает объекты из этой условной базы, это такой мета-класс для описаний абстрактных объектов. Там очень много параметров, и что важно, они постоянно там добавляются-удаляются, в зависимости от требований проекта.
А есть классы, объекты которых инициализируются по описанию из этого мета-класса, и тут все эти классы делают выборку из параметров, типа:
select erw, dgf, oer, osd from metaclass where id = id
Грубо говоря, они по id-у находят объект в стоке и просто копируют
нужные для себя поля.
И эти прикладные классы (их переменные) ещё активнее создаются и модифицируются, в зависимости от задач.
И у них есть тот самый метод Copy, который копирует из объекта-описания нужные данные.
Собственно, вопрос в том, что не хочется каждый раз, когда добавляется какой-то элемент в класс, идти писать его копирование. Это, конечно, дисциплинирует, но было пару раз, когда я забывал это сделать.
Можно ли что-то сделать, чтобы при описании переменной в классе указать, чтобы нагенерился код в копире? Один способ с помощью адовой шаблонной магии я знаю, но вот менять
int val_ на что-то громоздкое не хочется, хочется иметь на руках именно переменную нужного типа и не лезть в неё геттерами-сеттерами, простота написания и доступа для меня критична.
Несколько лет назад такая ситуация была с конструкторами: добавил переменную, но забыл её обнулить. Я разбирал одно время старый код на работе и много такого видел. А теперь есть:
int val_{some};
которое решает эту проблему почти полностью. Я не успеваю смотреть все новые вещи в плюсах, может уже и тут что-то появилось? Даже было бы хорошо иметь assert на момент компиляции(java @NonNull вспомнилось), если я забыл положить переменную в ксерокс