smart_this

自分は、まともにポインタを扱えない。


だからいつもポインタを使わずに、スマートポインタを使っているのだけれども、スマートポインタにも欠点はある。

class CApp{
public:
    static void add( Hoge* hoge ){
        // hogeをリストに追加
    }
    static void del( Hoge* hoge ){
        // hogeをリストから削除
    }
private:
    static list< Hoge* > _hogeList;
};

class Hoge{
public:
    Hoge(){ CApp::add( this ); }
    ~Hoge(){ CApp::del( this ); }
}

こんな風に、コンストラクタでリストに登録して、デストラクタでリストから削除するクラスを作りたいと思うときはよくあります。
しかし、これだとリストがスマートポインタではないので、

list< smart_ptr< Hoge > >

こうします。
すると、Hogeのコンストラクタでthisを渡すことが出来なくなってしまって、

smart_ptr< Hoge > hoge = smart_ptr< Hoge >( new Hoge );
CApp::add( hoge );

こうしないといけなくなります。
Hogeを作るたびに必ずCApp::add()としなければならないのだとすれば、どっかで間違えてしまう可能性が大です。
このHoge生成と登録を同時にやってくれるFactoryを作ってもいいですが、処理ごとにFactoryを作るのは非常に面倒です。


これはもう自身へのスマートポインタを取得するためのsmart_thisを作るしかない!


そうすれば、

Hoge(){ CApp::add( getThis() ); }

こうやって、thisの代わりにgetThis()を使うだけでOKです。


ビバ!smart_this!


……でも、これにはいろんな問題があります。