Предположим, что класс C состоит из двух членов: M1 и M2 , где M1 содержит указатель P это относится к M2 .
Для каждого экземпляра X из C должен храниться следующий инвариант: X.M1.P указывает на X.M2 .
Существует ли идиоматический способ реализации этого поведения в C ++ без необходимости реализации конструктора перемещения и оператора присваивания?
Я спрашиваю, потому что мне кажется, что концептуально указатель P должен быть относительно M1 . Конструкторы перемещения не по умолчанию и операторы присваивания кажутся очень трудоемкими (особенно если их несколько) для этой простой концепции.
Мой конкретный пример использования аналогичен приведенному ниже примеру (где set
равно M1 , а less
равно M2 ). Возможно, мой фундаментальный подход неверен - есть ли лучший способ, чем указатель на Relation
в Less
?
using Relation = std::vector<std::vector<bool>>;
class C {
public:
C() { /* less = ...; */ }
C(C&&) = default;
C& operator=(C&&) = default;
private:
struct Less {
explicit Less(const Relation* r) : r(r) {}
bool operator()(int i, int j) { return (*r)[i][j]; }
const Relation* r;
};
Relation less;
std::set<int, Less> set{Less(&less)};
};
C a;
std::cout << a.set.key_comp().r == &a.less << std::endl; // true
C b = std::move(a);
std::cout << b.set.key_comp().r == &b.less << std::endl; // false