Одно из упражнений в книге Страуструпа гласит:Как бы я повторно реализовать dynamic_cast?
Написать шаблон
ptr_cast
, который работает какdynamic_cast
, за исключением того, что он бросаетbad_cast
вместо того, чтобы возвращать 0.
Единственное решение, мне удалось придумать было обмануть, обернув dynamic_cast
собственно:
template<typename Dst, typename Src>
Dst ptr_cast(Src* p) {
Dst pt = dynamic_cast<Dst>(p);
if (!pt)
throw std::bad_cast();
return pt;
}
class B {
public:
virtual ~B();
};
B::~B() {}
class D : public B {};
class C {};
int main() {
B* pb = new D;
D* pd = ptr_cast<D*>(pb); // passes
C* pc = ptr_cast<C*>(pb); // throws as planned
return 0;
}
Однако, у меня есть сохраняющийся SUSP что это не то, что имел в виду автор. Кто-нибудь имеет лучшую идею? Элемент отмечен одной звездой, что означает, что это должно быть что-то действительно очевидное.
'dynamic_cast' является фундаментальной частью C++. Других альтернатив этому нет, и я не могу думать о каком-либо возможном способе интерпретировать этот вопрос, кроме того, что вы написали выше. –