2010-02-14

正しい方法じゃないなぁ

boost::shared_ptrでHMODULEなどを管理する - ベイダー日記

これが動くのは、そもそも、HMODULEが、ポインター型であることを前提としている。HMODULEがポインターであることを隠すために、わざわざHMODULEという名前を使っているというのに。このコードは、ポータビリティに問題があると言える。

unique_ptrならば、こんなことができる。

struct HMODULE_deleter
{
        typedef HMODULE pointer ;

        void operator () ( HMODULE handle )
        {
                FreeLibrary( handle ) ;
        }

} ;

int main()
{
        std::unique_ptr< HMODULE, HMODULE_deleter > handle( LoadLibrary( _T("kernel32.lib") ) ) ;
}

なぜならば、unique_ptr<T, D>は、remove_reference<D>::type::pointerが存在する場合、unique_ptr::pointerは、その型になるからだ。

しかし、残念ながら、これは現行のshared_ptrには使えない。shared_ptrは、unique_ptrを引数に取るコンストラクタを提供している。しかし、unique_ptrのこの機能を提供していないということは、デフォルトのデリーターを使っていないunique_ptrからは、初期化できなくなってしまう。

なぜ、shared_ptrも、デリーターをテンプレート引数に取らないのだろう。いまなら、意見を言えば間に合うだろうか。

追記:よく考えたら、remove_referenceに通しているわけだから、typeはいらなかった。

1 comment:

wata_d said...

ありがとうございます。unique_ptrの使い方は知りませんでした。勉強になります。
shared_ptrでも使えると便利そうですね。