PImpl и сравнение: возможно ли без RTTI ?
От: Аноним  
Дата: 28.07.09 12:08
Оценка:
Пусть есть базовый класс реализации

class Impl_base;


и класс-указатель на реализацию

class PImpl {
 public:
  bool operator == (const PImpl &impl) const;

 private:
  Impl_base *m_pImpl;
};


Вопрос, как мне реализовать operator ==() ?

Напрашивается такое решение: в базовом классе определяем чисто виртуальную функцию IsEqual() и дергаем ее в теле PImpl::operator ==().

class Impl_base {
 public:
  virtual bool IsEqual(const Impl_base* pImpl) const=0;
};

bool PImpl::operator == (const PImpl &impl) const
{
  return m_pImpl->IsEqual(impl);
}


И делаем конкретные реализации Impl_base, в которых определяем функцию IsEqual().

class Impl_A: public Impl_base {
 public:
  virtual bool IsEqual(const Impl_base* pImpl) const;
  {
    const Impl_A *pImplA=dynamic_cast<const Impl_A*>(pImpl);
    if (!pImplA) return false;
    return m_a==pImplA->m_a;
  }

 private:
  int m_a;
};



Смущает то, что, для решения такой, казалось бы простой задачи приходится использовать тяжелую артиллерию — RTTI.
Можно ли как-то сравнить PImpl-ы, не использую dynamic_cast<>(), typeid(), и уж тем более самопальные заменители RTTI ?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.