Пусть есть базовый класс реализации
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 ?