如果我希望将dynamic_cast
与shared_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的
答案 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。,