是的,这是由标准,§20.9.11.2.10[util.smartptr.shared.cast]支持的。
你需要的是:
-
std::static_pointer_cast<>()
-
std::dynamic_pointer_cast<>()
它们具有与C++ 03计数器部分相同的语义。
static_cast<>()
和
dynamic_cast<>()
. 唯一的区别是他们只在
std::shared_ptr
s、 为了详细起见,他们做了您期望的事情,并在原始和新的cast之间正确地共享了引用计数
shared_ptr
s。
struct X { virtual ~X(){} };
struct Y : public X {};
struct Z : public X {};
int main()
{
{
//C++03
X* x = new Z;
Z* z = dynamic_cast<Z*>(x);
assert(z);
x = new Y;
z = dynamic_cast<Z*>(x);
assert(!z);
z = static_cast<Z*>(x);
assert(z); //EVIL!!!
}
{
//C++0x
std::shared_ptr<X> x{new Z};
std::shared_ptr<Z> z{std::dynamic_pointer_cast<Z>(x)};
assert(z);
x = std::make_shared<Y>();
z = std::dynamic_pointer_cast<Z>(x);
assert(!z);
z = std::static_pointer_cast<Z>(x);
assert(z); //EVIL!!!
// reference counts work as expected.
std::shared_ptr<Y> y{std::static_pointer_cast<Y>(x)};
assert(y);
std::weak_ptr<Y> w{y};
assert(w.expired());
y.reset();
assert(w.expired());
x.reset();
assert(!w.expired());
}
{
//s'more nice shared_ptr features
auto z = std::make_shared<X>();
std::shared_ptr<X> x{z};
assert( z == x );
x = z; //assignment also works.
}
}