auto_ptr和dynamic_pointer_cast

时间:2011-07-05 11:31:21

标签: c++ boost

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

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

我正在使用boost for shared_ptr的

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

根据auto_ptr的性质(你永远不应该使用它。或者你必须使用它,永远不要复制 - 构造或复制 - 分配),复制等同于移动。因此,如果没有转让所有权,就无法进行演员表演,导致前任所有者失去所有权。

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

我确信你可以为你想要的任何指针类型部分地专门化dynamic_pointer_cast。

此外,{C} 0x中不推荐使用auto_ptr;标准委员会不会通过dynamic_pointer_cast使用它来推广使用已弃用的功能。

答案 2 :(得分:1)

会是这样的:

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

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

如果没有,您可以reset原始auto_ptr,并抛出异常。

由于特别是微软对auto_ptr的实现非常不稳定,而且可能仍然存在,因此依赖标准保证的转换非常重要。

干杯&amp;第h。,