続・スマートポインタ
んですっきりした改訂版。今度はちゃんとアップキャストも出来るはずです。
template< class T > class smart_ptr { public: smart_ptr():m_pnCounter( NULL ),m_pObject( NULL ){} template< class Y > smart_ptr( smart_ptr< Y >& p ){ m_pObject = p.m_pObject; m_pnCounter = p.m_pnCounter; (*m_pnCounter)++; } smart_ptr( T* p ){ m_pObject = p; m_pnCounter = new unsigned int; *m_pnCounter = 1; } template< class Q > smart_ptr< T >& operator =( smart_ptr< Q >& p ){ Reset(); m_pnCounter = p.m_pnCounter; m_pObject = p.m_pObject; (*m_pnCounter)++; return *this; } template< class P > smart_ptr< T >& operator =( P* p ){ Reset(); if( p != NULL ){ m_pnCounter = new unsigned int; m_pObject = p; *m_pnCounter = 1; } return *this; } virtual ~smart_ptr(){ Reset(); } T& operator*() const{ return *m_pObject; } T* operator->() const{ return m_pObject; } bool operator==( const T* p ) const{ return m_pObject == p; } bool operator==( const smart_ptr< T >& p ) const{ return m_pObject == p.m_pObject; } bool operator!=( const T* p ) const{ return m_pObject != p; } bool operator!=( const smart_ptr< T >& p ) const{ return m_pObject != p.m_pObject; } friend class smart_ptr; protected: void Reset(){ if( m_pObject == NULL ){ return; } if( --(*m_pnCounter) == 0 ){ delete m_pnCounter; delete m_pObject; } m_pnCounter = NULL; m_pObject = NULL; return; } private: unsigned int* m_pnCounter; T* m_pObject; };
いやはや、たったこれだけで実装できるんですね。ちょいと意外でした。参照カウンタ以外なにも付いていません。コンストラクタと演算子だけというすごいクラス。ていうか、多分それ以上は必要ないかなぁ〜と。あと必要なのは非参照カウンタ用のポインタと配列ですね。それだけあれば十分かなと。
まあ、すっきりした分、意外と速いです。ベンチマークしてみたところ、VC7でboost::shared_ptrの倍近くまでいきました。
そろそろやめて仕事するか・・・・それとも配列まで作るか?