Частное наследство и своп - PullRequest
1 голос
/ 27 октября 2010

Я использую частное наследование в реализации двух очень связанных классов. using Base::X; очень полезный и элегантный. Однако я не могу найти элегантное решение для повторного использования функции подкачки базового класса.

class A
{
public:
   iterator       begin();
   const_iterator begin() const;
   const_iterator cbegin() const;

   A clone();

   void swap( A& other );
};

class Const_A : private A
{
public:
   // I think using A::A; will be valid in C++0x
   Const_A( const A& copy) : A(copy) { }

   // very elegant, concise, meaningful
   using A::cbegin;

   // I'd love to write using A::begin;, but I only want the const overload
   // this is just forwarding to the const overload, still elegant
   const_iterator begin() const
   { return A::begin(); }

   // A little more work than just forwarding the function but still uber simple
   Const_A clone()
   { return Const_A(A::clone()); }

   // What should I do here?
   void swap( Const_A& other )
   { /* ??? */ }
};

Пока единственное, что я могу придумать, это вставить копию A::swap в определение Const_A::swap, YUCK!

Есть ли элегантное решение для повторного использования свопа частного базового класса?

Есть ли более чистый способ реализовать то, что я пытаюсь сделать здесь (const-обертка для класса)?

Ответы [ 2 ]

5 голосов
/ 27 октября 2010

Ну, не могли бы вы просто назвать базовую версию swap?

void swap( Const_A& other )
{
    A::swap(other); // swaps the `A` portion of `this`.
    // …
}

Вместо вы обычно меняете местами участников, относящихся только к Const_A, а не A, но поскольку в вашем конкретном случае их нет, это все, что вам нужно. *

3 голосов
/ 27 октября 2010

Вы можете сделать как с остальными методами:

void Const_A::swap( Const_A& other ) {
   A::swap(other);
   // here any specifics
}
...