Держите указатели между учениками стабильно при движении - PullRequest
3 голосов
/ 05 июня 2019

Предположим, что класс 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
...