Ещё немного метапрограммирования
От: CEMb  
Дата: 22.12.22 11:23
Оценка:
Добрый день.

Есть ли какая-то возможность сделать так(метакод):


// 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 вспомнилось), если я забыл положить переменную в ксерокс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.