VC2012では、コンストラクタ内に一意のポインタとディテクタを使用してミューテックスを作成したいので、CloseHandleを呼び出すだけでデストラクタを作成する必要はありません。std :: unique_ptr、deletersおよびWin32 API
私はこれが働くだろうと思っているだろう:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
が、私はエラーを取得するコンパイル上:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
私はこのようにコンストラクタを変更する場合:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
私はさらに珍しい:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
私は今失業しています。 HANDLEはvoid *のtypedefです:私が知る必要のある変換マジックはありますか?
あなたの質問には良い答えがありますが、私は真剣に、この目的のためにstd :: unique_ptrのデリターを悪用するのではなく、自分のカスタムオーナークラスをMutexのために使うことを検討します。 HANDLEがポインタであるという事実は実装の詳細です。インデックスやその他の魔法の価値があったのと同じように簡単にできます。独自のRAⅡラッパーを作成し、unique_ptrを残して "実際の"ポインタを管理してください。 –
@Adrian:あなたの意見が分かります。また、コンストラクタ/デストラクタにRAII Wait/Releaseペアリングを含めることもできます。乾杯。 – hatcat