In VC2012, desidero creare un mutex in un costruttore utilizzando un puntatore univoco e un deleter, in modo che non sia necessario creare un distruttore per chiamare CloseHandle.std :: unique_ptr, deleters e API Win32
avrei pensato che questo dovrebbe funzionare:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
ma sulla compilazione ottengo un errore:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Quando ho modificare il costruttore così:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
I ancora più insolito:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Sono in perdita ora. HANDLE è un typedef per void *: c'è qualche magia di conversione che devo sapere?
V'è una buona risposta alla tua domanda qui sotto, ma vorrei seriamente in considerazione rotazione mia classe di appartenenza personalizzata per un mutex, piuttosto che sfruttando deleter di std :: unique_ptr per questo scopo. Il fatto che un HANDLE sia un puntatore è un dettaglio di implementazione. Potrebbe facilmente essere stato un indice o un altro valore magico. Crea il tuo wrapper RAII per questo e lascia unique_ptr per gestire i puntatori "reali". –
@Adrian: Vedo il tuo punto. Potrebbe anche contenere l'accoppiamento RAI Wait/Release nel costruttore/distruttore. Saluti. – hatcat