VC2012'de, benzersiz bir işaretçi ve bir deletici kullanarak bir kurucuda bir muteks oluşturmak istiyorum, böylece sadece CloseHandle'ı aramak için bir yok edici oluşturmam gerekmiyor.std :: unique_ptr, deleters ve Win32 API'sı
Bu işe olacağını sanırdım:
struct foo
{
std::unique_ptr<HANDLE, BOOL(*)(HANDLE)> m_mutex;
foo() : m_mutex(CreateMutex(NULL, FALSE, NULL), CloseHandle) {}
}
ama derleme üzerinde bir hata alıyorum:
foo() : m_mutex((void*)CreateMutex(NULL, FALSE,
(name + " buffer mutex").c_str()), CloseHandle) {}
I:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,int
(__cdecl *const &)(HANDLE)) throw()' : cannot convert parameter 1 from
'HANDLE' to 'void *'
Ben böylece kurucusunu değiştirme daha sıra dışı olsun:
error C2664: 'std::unique_ptr<_Ty,_Dx>::unique_ptr(void *,
int (__cdecl *const &)(HANDLE)) throw()' : cannot convert
parameter 1 from 'void *' to 'void *'
Şu an kaybettim. HANDLE, void için bir yazım hatasıdır *: Bilmem gereken bazı dönüşüm büyüsü var mı?
Aşağıdaki soruna iyi bir yanıt var, ancak bu amaç için std :: unique_ptr's deleterini istismar etmekten ziyade, bir Mutex için kendi özel sahiplik sınıfımı hazırlamayı ciddi olarak düşünürüm. HANDLE'ın bir işaretçi olması, uygulama detayıdır. Bir indeks veya başka bir büyü değeri kadar kolay olabilirdi. Bunun için kendi RAII sarıcınızı yapın ve "gerçek" işaretçileri yönetmek için unique_ptr'den çıkın. –
@Adrian: Senin noktanı görüyorum. Ayrıca, kurucu/yıkıcıda RAII Bekleme/Bırakma eşleştirmesini de içerebilir. Şerefe. – hatcat