std :: unique_ptr, deleters y la API de Win32
En VC2012, quiero crear una exclusión mutua en un constructor utilizando un puntero único y un eliminador, de modo que no necesito crear un destructor solo para llamar a CloseHandle.
Habría pensado que esto funcionaría:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
Pero al compilar me sale un error:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Cuando modifico el constructor así:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
Me sale aún más inusual:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Estoy en una pérdida ahora. HANDLE es un typedef para void *: ¿hay alguna magia de conversión que deba conocer?