如果我希望使用dynamic_cast
与shared_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的
如果我希望使用dynamic_cast
与shared_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的
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;
}
这就是我现在要做的,我只是想知道是否有一个标准的方式做到这一点。 –
@ edA-qa AFAICT没有等价于单指令指针(即boost :: scoped_ptr,std :: auto_ptr或std :: unique_ptr)的指针,所以我建议你自己动手。 –
增强通过的auto_ptr
性质(你不应该使用。或者,如果你要使用它,从来没有复制构造或复制分配给它),复制相当于移动。因此,如果没有转让所有权,没有办法进行演员制,导致前任所有人失去所有权。
如果它返回一个空的auto_ptr
(意思是失败的dynamic_cast
)会发生什么?由于演员阵容,指针的原始拥有者失去了所有权。由于剧组失败,新所有者没有指针。那么谁会拥有它?
我相信你可以部分地专注于dynamic_pointer_cast任何你想要的指针类型。
此外,auto_ptr
在C++ 0x中已弃用;标准委员会是不会通过与它dynamic_pointer_cast
工作,推广使用过时的功能..
当你说'从来没有....复制 - 分配'它可能有助于指出你的意思(我假设你允许RVO'移动'任务和可能参数传递临时工?) – sehe
因为我没有一个C++ 0x编译器,我需要暂时使用'auto_ptr'。所有权似乎对我来说已经足够清楚了,如果施放失败,那么该对象将被简单地删除(您已经分配了ptr,所以原始应该失去所有权) –
它会是这样的:
auto_ptr<Derived> pd(
dynamic_cast<Derived*>(base.get())? static_cast<Derived*>(base.release()) : 0
);
然后检查是否发生所有权转移。
如果没有,你可能会reset
原来auto_ptr
,并抛出一个异常。
由于特别是微软对auto_ptr
的执行一直非常不稳定,而且可能依然存在,所以的重要性不在于依赖于标准保证的转换。
干杯&心连心,
我真的很喜欢动态检查后的静态投射。 – mskfisher
错误的,A型和B周围的方式?不需要从派生('A')到基地('B')的'dynamic_cast'。 –
@Luc,是的,谢谢。 –