Информация об изменениях

Сообщение 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

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

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 здесь выглядит лишним, по-моему — вполне достаточно оператора присваивания.