Я использую частное наследование при реализации двух очень родственных классов. using Base::X;
очень полезен и элегантен. Тем не менее, я не могу найти элегантное решение для повторного использования функции swap базового класса.Частное наследование и своп
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
«определение s в Const_A::swap
» s определение, YUCK!
Есть ли элегантное решение для повторного использования замены частного базового класса?
Есть ли более чистый способ реализовать то, что я пытаюсь сделать здесь (оболочка const для класса)?
вы имели в виду, чтобы вернуть 'iterator' (! Вместо' const_iterator') для 'begin'? В противном случае я не вижу смысла иметь две функции и переопределять функцию в производном классе. –
'std :: vector <> :: begin() -> iterator' и' std :: vector <> :: begin() const -> const_iterator'. Это именно то, что я сделал, и мои классы имеют сходную семантику. Неужели я не понимаю ваш вопрос? –
понял, ты прав. Но что же такое метод 'cbegin'? –