Не проверено, но вы можете использовать простой декоратор
template <typename A1, typename A2>
class Association
{
public:
void associate(A2& ref)
{
if (_ref && &(*_ref) == &ref) return; // no need to do anything
// update the references
if (_ref) _ref->reset_association();
// save this side
_ref = ref;
ref.associate(static_cast<A1&>(*this));
}
void reset_association() { _ref = boost::none_t(); }
boost::optional<A2&> get_association() { return _ref; }
private:
boost::optional<A2&> _ref;
};
сейчас:
struct B;
struct A : public Association<A, B> {
};
struct B : public Association<B, A> {
};
теперь эти операции должны выполняться правильно.
A a, a2;
B b;
a.associate(b);
b.associate(a2);
ПРИМЕЧАНИЯ. Я использую boost::optional
для хранения ссылки, а не указателя, ничто не мешает вам использовать указатели напрямую. Конструкция, которую вы после того, как я не думаете, существует по умолчанию в C ++, поэтому вам нужно что-то вроде выше, чтобы это заработало ...