C++ 我将如何重新实现dynamic_cast?
Stroustrup书中的一个练习如下: 编写一个类似于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
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++的基础部分。除了上面你所写的,我想不出任何可能的方法来解释这个问题。谢谢你在有人把它编辑成副本之前回答了我原来的问题。总有一天我会明白他们为什么要做这样的事情,但不是今天。