続・スマートポインタ

んですっきりした改訂版。今度はちゃんとアップキャストも出来るはずです。

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の倍近くまでいきました。


そろそろやめて仕事するか・・・・それとも配列まで作るか?