Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我将如何重新实现dynamic_cast?_C++_Dynamic Cast - Fatal编程技术网

C++ 我将如何重新实现dynamic_cast?

C++ 我将如何重新实现dynamic_cast?,c++,dynamic-cast,C++,Dynamic Cast,Stroustrup书中的一个练习如下: 编写一个类似于dynamic\u cast的模板ptr\u cast,除了它抛出bad\u cast而不是返回0 我想出的唯一解决办法是通过包装dynamic\u castproperty来作弊: template<typename Dst, typename Src> Dst ptr_cast(Src* p) { Dst pt = dynamic_cast<Dst>(p); if (!pt) th

Stroustrup书中的一个练习如下:

编写一个类似于
dynamic\u cast
的模板
ptr\u cast
,除了它抛出
bad\u cast
而不是返回0

我想出的唯一解决办法是通过包装
dynamic\u cast
property来作弊:

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;
}
模板
Dst ptr_铸件(Src*p){
Dst pt=动态铸造(p);
如果(!pt)
抛出std::bad_cast();
返回pt;
}
B类{
公众:
虚拟~B();
};
B::~B(){}
D类:公共B{};
C类{};
int main(){
B*pb=新的D;
D*pd=ptr_cast(pb);//通过
C*pc=ptr_cast(pb);//按计划抛出
返回0;
}

然而,我一直怀疑这不是作者的意思。有人有更好的主意吗?该项目标有一颗星,这意味着它必须是非常明显的东西。

您的解决方案几乎完全符合boost中的解决方案:

//  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++编程语言中,第三ED,Bjarne Stroustrup,
//第15.8节练习1,第425页。
模板
内联目标多态转换(源*x)
{
目标tmp=动态施法(x);
如果(tmp==0)boost::throw_异常(std::bad_cast());
返回tmp;
}

<>这可能是一个很好的例子。

<代码> Dyjic Studio是C++的基础部分。除了上面你所写的,我想不出任何可能的方法来解释这个问题。谢谢你在有人把它编辑成副本之前回答了我原来的问题。总有一天我会明白他们为什么要做这样的事情,但不是今天。