Utilisation de mem_fun_ref avec boost :: shared_ptr

Suivant les conseils de cette page , j’essaie de faire en sorte que shared_ptr appelle IUnknown :: Release () au lieu de delete:

IDirectDrawSurface* dds; ... //Allocate dds return shared_ptr(dds, mem_fun_ref(&IUnknown::Release)); 

erreur C2784: ‘std :: const_mem_fun1_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg) const)’: impossible de déduire l’argument modèle pour ‘_Result (__thiscall _Ty *) (_Arg) const ‘de’ ULONG (__cdecl IUnknown :: *) (void) ‘

erreur C2784: ‘std :: const_mem_fun_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void) const’ ‘: impossible de déduire l’argument de modèle pour’ _Result (__thiscall _Ty :: * (void) ) const ‘from’ ULONG (__cdecl IUnknown :: *) (void) ‘

erreur C2784: ‘std :: mem_fun1_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg))’: impossible de déduire l’argument de modèle pour ‘_Result (__thiscall _Ty :: *)’ _Arg) ‘de’ ULONG (__cdecl IUnknown :: *) (void) ‘

erreur C2784: ‘std :: mem_fun_ref_t std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void))’: impossible de déduire l’argument de modèle pour ‘_Result (__thiscall _Ty :: *) (void) ‘from’ ULONG (__cdecl IUnknown :: *) (void) ‘

erreur C2661: ‘boost :: shared_ptr :: shared_ptr’: aucune fonction surchargée ne prend 2 arguments

Je ne sais pas quoi faire de cela. Ma connaissance limitée du template / foncteur m’a amené à essayer

 typedef ULONG (IUnknown::*releaseSignature)(void); shared_ptr(dds, mem_fun_ref(static_cast(&IUnknown::Release))); 

Mais en vain. Des idées?

Le spécificateur de convention d’appel n’est-il pas un problème? Est-ce que ça va?

 void iUnk_delete(IUnknown* u) { u->Release(); } return shared_ptr(dds, iUnk_delete); 

std::mem_fun_ref ne prend pas en charge la conversion d’appel stdcall std::mem_fun que vous pouvez utiliser pour les pointeurs.

Vous pouvez utiliser boost::mem_fn place. Vous devez définir BOOST_MEM_FN_ENABLE_STDCALL pour travailler avec les méthodes COM.

 shared_ptr( dds, boost::mem_fn(&IUnknown::Release) ); 

Et puisque votre object possède le nombre de références internes, vous pouvez utiliser plutôt boost::intrusive_ptr .

Je sais que ce n’est peut-être pas ce que vous voulez, mais incluez simplement ATLBase.h et utilisez ensuite le modèle CComPtr.

Vous utilisez alors juste

  CComPtr< IDirect3DSurface9 > surf; pDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &surf ); 

Vous pouvez ensuite le copier sur un autre CComPtr et il gérera pour vous tous les AddRefs et communiqués. Classe de template très utile.