function template
<memory>
std::static_pointer_cast
template <class T, class U> shared_ptr<T> static_pointer_cast (const shared_ptr<U>& sp) noexcept;
Static cast of shared_ptr
Returns a copy of sp of the proper type with its stored pointer casted statically from U* to T*.
If sp is not empty, the returned object shares ownership over sp's resources, increasing by one the use count.
If sp is empty, the returned object is an empty shared_ptr.
The function can only cast types for which the following expression would be valid:
1
|
static_cast<T*>(sp.get())
|
Parameters
- sp
- A shared_pointer.
U* shall be convertible to T* using static_cast.
Return Value
A shared_ptr object that owns the same pointer as sp (if any) and has a shared pointer that points to the same object as sp with a potentially different type.
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
// static_pointer_cast example
#include <iostream>
#include <memory>
struct A {
static const char* static_type;
const char* dynamic_type;
A() { dynamic_type = static_type; }
};
struct B: A {
static const char* static_type;
B() { dynamic_type = static_type; }
};
const char* A::static_type = "class A";
const char* B::static_type = "class B";
int main () {
std::shared_ptr<A> foo;
std::shared_ptr<B> bar;
foo = std::make_shared<A>();
// cast of potentially incomplete object, but ok as a static cast:
bar = std::static_pointer_cast<B>(foo);
std::cout << "foo's static type: " << foo->static_type << '\n';
std::cout << "foo's dynamic type: " << foo->dynamic_type << '\n';
std::cout << "bar's static type: " << bar->static_type << '\n';
std::cout << "bar's dynamic type: " << bar->dynamic_type << '\n';
return 0;
}
|
Output:
foo's static type: class A
foo's dynamic type: class A
bar's static type: class B
bar's dynamic type: class A
|