Type Erasure in boost::shared_ptr

そういえば,Type Erasureの一番顕著な実例が boost::shared_ptr っていうの書くの忘れてた.

class C{};

boost::shared_ptr< void > p( new C );
// 参照カウントが 0 になるときちんと『C のポインタに対する』 delete を実行する

別に void だけに限らず,例えばデストラクタが仮想でない基底クラスの shared_ptr にその派生クラスのポインタを突っ込んだりしても安全に delete してくれたりする.
っていうか,上のコードがちゃんと C のデストラクタをちゃんと呼んで,正しくメモリを開放してくれるというのをなかなか信じてもらえなかった.