Сообщение Re: Ещё немного метапрограммирования от 22.12.2022 14:53
Изменено 22.12.2022 14:56 rg45
Re: Ещё немного метапрограммирования
Здравствуйте, CEMb, Вы писали:
CEM>Собственно, вопрос в том, что не хочется каждый раз, когда добавляется какой-то элемент в класс, идти писать его копирование. Это, конечно, дисциплинирует, но было пару раз, когда я забывал это сделать.
CEM>Можно ли что-то сделать, чтобы при описании переменной в классе указать, чтобы нагенерился код в копире? Один способ с помощью адовой шаблонной магии я знаю, но вот менять int val_ на что-то громоздкое не хочется, хочется иметь на руках именно переменную нужного типа и не лезть в неё геттерами-сеттерами, простота написания и доступа для меня критична.
По-моему, это несложно решается и без метапрограммирования. Просто все поля, которые должны копироваться(перемещаться), вносишь в состав безымянной структуры. Пишешь конструктор(ы) копирования(перемещения) и оператор(ы) присваивания, в которых манипулируешь структрурой в целом, а не каждым полем в отдельности. А те поля, которые не должны копироваться(перемещаться) оставляешь непосредственно в классе. После этого, при добавлении нового поля, остается лишь поместить его в правильное место — в класс, либо в структуру:
http://coliru.stacked-crooked.com/a/6bb55fd5f134eb65
CEM>Собственно, вопрос в том, что не хочется каждый раз, когда добавляется какой-то элемент в класс, идти писать его копирование. Это, конечно, дисциплинирует, но было пару раз, когда я забывал это сделать.
CEM>Можно ли что-то сделать, чтобы при описании переменной в классе указать, чтобы нагенерился код в копире? Один способ с помощью адовой шаблонной магии я знаю, но вот менять int val_ на что-то громоздкое не хочется, хочется иметь на руках именно переменную нужного типа и не лезть в неё геттерами-сеттерами, простота написания и доступа для меня критична.
По-моему, это несложно решается и без метапрограммирования. Просто все поля, которые должны копироваться(перемещаться), вносишь в состав безымянной структуры. Пишешь конструктор(ы) копирования(перемещения) и оператор(ы) присваивания, в которых манипулируешь структрурой в целом, а не каждым полем в отдельности. А те поля, которые не должны копироваться(перемещаться) оставляешь непосредственно в классе. После этого, при добавлении нового поля, остается лишь поместить его в правильное место — в класс, либо в структуру:
http://coliru.stacked-crooked.com/a/6bb55fd5f134eb65
class A
{
public:
A() = default;
A(const A& rhs) : props_(rhs.props_) {}
A& operator = (const A& rhs) { props_ = rhs.props_; return *this; }
void Copy(const A& a) { *this = a; }
private:
struct
{
// meta-code: want to copy this in Copy method
int iVal_{};
} props_;
// just ptr, do nothing
float* fPtr_{};
};
Re: Ещё немного метапрограммирования
Здравствуйте, CEMb, Вы писали:
CEM>Собственно, вопрос в том, что не хочется каждый раз, когда добавляется какой-то элемент в класс, идти писать его копирование. Это, конечно, дисциплинирует, но было пару раз, когда я забывал это сделать.
CEM>Можно ли что-то сделать, чтобы при описании переменной в классе указать, чтобы нагенерился код в копире? Один способ с помощью адовой шаблонной магии я знаю, но вот менять int val_ на что-то громоздкое не хочется, хочется иметь на руках именно переменную нужного типа и не лезть в неё геттерами-сеттерами, простота написания и доступа для меня критична.
По-моему, это несложно решается и без метапрограммирования. Просто все поля, которые должны копироваться(перемещаться), вносишь в состав безымянной структуры. Пишешь конструктор(ы) копирования(перемещения) и оператор(ы) присваивания, в которых манипулируешь структрурой в целом, а не каждым полем в отдельности. А те поля, которые не должны копироваться(перемещаться) оставляешь непосредственно в классе. После этого, при добавлении нового поля, остается лишь поместить его в правильное место — в класс, либо в структуру:
http://coliru.stacked-crooked.com/a/6bb55fd5f134eb65
P.S. И метод Copy здесь выглядит лишним, по-моему — вполне достаточно оператора присваивания.
CEM>Собственно, вопрос в том, что не хочется каждый раз, когда добавляется какой-то элемент в класс, идти писать его копирование. Это, конечно, дисциплинирует, но было пару раз, когда я забывал это сделать.
CEM>Можно ли что-то сделать, чтобы при описании переменной в классе указать, чтобы нагенерился код в копире? Один способ с помощью адовой шаблонной магии я знаю, но вот менять int val_ на что-то громоздкое не хочется, хочется иметь на руках именно переменную нужного типа и не лезть в неё геттерами-сеттерами, простота написания и доступа для меня критична.
По-моему, это несложно решается и без метапрограммирования. Просто все поля, которые должны копироваться(перемещаться), вносишь в состав безымянной структуры. Пишешь конструктор(ы) копирования(перемещения) и оператор(ы) присваивания, в которых манипулируешь структрурой в целом, а не каждым полем в отдельности. А те поля, которые не должны копироваться(перемещаться) оставляешь непосредственно в классе. После этого, при добавлении нового поля, остается лишь поместить его в правильное место — в класс, либо в структуру:
http://coliru.stacked-crooked.com/a/6bb55fd5f134eb65
class A
{
public:
A() = default;
A(const A& rhs) : props_(rhs.props_) {}
A& operator = (const A& rhs) { props_ = rhs.props_; return *this; }
void Copy(const A& a) { *this = a; }
private:
struct
{
// meta-code: want to copy this in Copy method
int iVal_{};
} props_;
// just ptr, do nothing
float* fPtr_{};
};
P.S. И метод Copy здесь выглядит лишним, по-моему — вполне достаточно оператора присваивания.