shared_ptr
どうなるのかなーと思ったら問題なくデストラクタが呼ばれるみたい。
ほへー。
[ソース]
#include <memory> #include <iostream> struct X{ X(int value) : value(value){} ~X(){ std::cout << "delete X" << std::endl; } int value; }; struct Y{ ~Y(){ std::cout << "delete Y" << std::endl; } }; int main(){ std::shared_ptr<void> p = std::make_shared<X>(42); auto value = static_cast<X*>(p.get())->value; std::cout << value << std::endl; { std::shared_ptr<void> p = std::make_shared<Y>(); } return 0; }
[追記]
std::static_pointer_cast というヘルパ関数が用意されているのでそれを使えばいいみたいです。
static_assert(std::is_same<decltype(std::static_pointer_cast<X>(p)), std::shared_ptr<X>>{}, ""); auto value = std::static_pointer_cast<X>(p)->value; std::cout << value << std::endl; // => 42