2011-07-05 36 views
4

如果我希望使用dynamic_castshared_ptr我可以使用dynamic_pointer_cast。如果我想投一个auto_ptr,我该用什么?我假设的东西看起来像下面。auto_ptr和dynamic_pointer_cast

struct B : A { }; 
... 
auto_ptr<A> base(...); 
auto_ptr<B> derive = dynamic_pointer_cast<B>(base); 

我使用的shared_ptr的

+0

错误的,A型和B周围的方式?不需要从派生('A')到基地('B')的'dynamic_cast'。 –

+0

@Luc,是的,谢谢。 –

回答

4
auto_ptr<A> base(...); 
if(B* query = dynamic_cast<B>(base.get())) { 
    // take ownership 
    base.release(); 
    auto_ptr<B> derived(query); 

    // use and/or pass derived around here 
    // ... 
} else { 
    // no dice: leave base as owner 
} 

既然你已经这样做,然后重构它,就打它的命名空间您的选择和收工:

// Postcondition: 
// where r is the returned pointer and p == from.get() 
// EITHER r == 0 AND from.get() == p 
// OR r.get() == dynamic_cast<To>(p) AND from == 0 
template<typename To, typename From> 
std::auto_ptr<To> 
dynamic_pointer_cast(std::auto_ptr<From>& from) 
{ 
    To* query = dynamic_cast<To>(from.get()); 
    return query ? from.release(), query : 0; 
} 
+0

这就是我现在要做的,我只是想知道是否有一个标准的方式做到这一点。 –

+0

@ edA-qa AFAICT没有等价于单指令指针(即boost :: scoped_ptr,std :: auto_ptr或std :: unique_ptr)的指针,所以我建议你自己动手。 –

1

增强通过的auto_ptr性质(你不应该使用。或者,如果你要使用它,从来没有复制构造或复制分配给它),复制相当于移动。因此,如果没有转让所有权,没有办法进行演员制,导致前任所有人失去所有权。

如果它返回一个空的auto_ptr(意思是失败的dynamic_cast)会发生什么?由于演员阵容,指针的原始拥有者失去了所有权。由于剧组失败,新所有者没有指针。那么谁会拥有它?

我相信你可以部分地专注于dynamic_pointer_cast任何你想要的指针类型。

此外,auto_ptr在C++ 0x中已弃用;标准委员会是不会通过与它dynamic_pointer_cast工作,推广使用过时的功能..

+0

当你说'从来没有....复制 - 分配'它可能有助于指出你的意思(我假设你允许RVO'移动'任务和可能参数传递临时工?) – sehe

+0

因为我没有一个C++ 0x编译器,我需要暂时使用'auto_ptr'。所有权似乎对我来说已经足够清楚了,如果施放失败,那么该对象将被简单地删除(您已经分配了ptr,所以原始应该失去所有权) –

1

它会是这样的:

auto_ptr<Derived> pd(
    dynamic_cast<Derived*>(base.get())? static_cast<Derived*>(base.release()) : 0 
    ); 

然后检查是否发生所有权转移。

如果没有,你可能会reset原来auto_ptr,并抛出一个异常。

由于特别是微软对auto_ptr的执行一直非常不稳定,而且可能依然存在,所以的重要性不在于依赖于标准保证的转换。

干杯&心连心,

+0

我真的很喜欢动态检查后的静态投射。 – mskfisher