我将如何重新实现dynamic

我将如何重新实现dynamic

This question already has answers here:
How to write own dynamic_cast

(4个答案)


4年前关闭。




Stroustrup的书中的一项练习内容如下:



我设法提出的唯一解决方案是通过适当包装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;
}

但是,我一直怀疑这不是作者的意思。有谁有更好的主意吗?该项目标有一颗星,这意味着它一定很明显。

最佳答案

您的解决方案几乎与boost中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;
}

因此,这可能是一个很好的选择。

关于c++ - 我将如何重新实现dynamic_cast? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40820446/

10-12 23:54