2016-11-26 74 views
1

一個在Stroustrup的書中的練習內容如下:我將如何重新實現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; 
} 

不過,我有一個揮之不去的停賽icion,這不是作者的意思。有沒有人有更好的主意?該項目標有一顆星,這意味着它必須是非常明顯的東西。

+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