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:
ありがとうございます。unique_ptrの使い方は知りませんでした。勉強になります。
shared_ptrでも使えると便利そうですね。
Post a Comment