2016-11-26 9 views
1

Одно из упражнений в книге Страуструпа гласит:Как бы я повторно реализовать 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 что это не то, что имел в виду автор. Кто-нибудь имеет лучшую идею? Элемент отмечен одной звездой, что означает, что это должно быть что-то действительно очевидное.

+2

'dynamic_cast' является фундаментальной частью C++. Других альтернатив этому нет, и я не могу думать о каком-либо возможном способе интерпретировать этот вопрос, кроме того, что вы написали выше. –

ответ

1

Ваше решение почти точно совпадает с одним из polymorphic_cast в наддува:

// Runtime checked polymorphic downcasts and crosscasts. 
// Suggested in The C++ Programming Language, 3rd Ed, Bjarne Stroustrup, 
// section 15.8 exercise 1, page 425. 

template <class Target, class Source> 
inline Target polymorphic_cast(Source* x) 
{ 
    Target tmp = dynamic_cast<Target>(x); 
    if (tmp == 0) boost::throw_exception(std::bad_cast()); 
    return tmp; 
} 

Так что, вероятно, является хорошим.

+0

Спасибо, что ответили на мой оригинальный вопрос, прежде чем какой-то парень отредактировал его в дубликат. Однажды я обязательно пойму, почему они делают такие вещи, но не сегодня. – sigil