Использование mem_fun_ref с boost :: shared_ptr - PullRequest
2 голосов
/ 14 мая 2010

Следуя совету этой страницы , я пытаюсь заставить shared_ptr вызвать IUnknown :: Release () вместо удаления:

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

ошибка C2784: 'std :: const_mem_fun1_ref_t <_Result, _Ty, _Arg> std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg) const)': не удалось вывести аргумент шаблона для '_Result (__: : *) (_ Arg) const 'из' ULONG (__cdecl IUnknown :: *) (void) '

ошибка C2784: 'std :: const_mem_fun_ref_t <_Result, _Ty> std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void) const)': не удалось вывести аргумент шаблона для '_Result (__thiscall _Ty :: * ) (void) const 'из' ULONG (__cdecl IUnknown :: *) (void) '

ошибка C2784: 'std :: mem_fun1_ref_t <_Result, _Ty, _Arg> std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (_ Arg))': не удалось вывести аргумент шаблона для '_Result (__thiscall _Ty :: *) (_ Arg) 'из' ULONG (__cdecl IUnknown :: *) (void) '

ошибка C2784: 'std :: mem_fun_ref_t <_Result, _Ty> std :: mem_fun_ref (_Result (__thiscall _Ty :: *) (void))': не удалось вывести аргумент шаблона для '_Result (__thiscall _Ty :: *) (void) 'из' ULONG (__cdecl IUnknown :: *) (void) '

ошибка C2661: 'boost :: shared_ptr :: shared_ptr': ни одна перегруженная функция не принимает 2 аргумента

Я понятия не имею, что с этим делать. Мои ограниченные знания шаблонов / функторов заставили меня попробовать

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

Но безрезультатно. Есть идеи?

Ответы [ 3 ]

6 голосов
/ 14 мая 2010

std::mem_fun_ref не поддерживает stdcall преобразование вызовов, а также std::mem_fun, которые вы можете использовать для указателей.

Вы можете использовать boost::mem_fn вместо этого. Вы должны определить BOOST_MEM_FN_ENABLE_STDCALL для работы с COM-методами.

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

И так как у вашего объекта есть внутренний счетчик ссылок, вы можете использовать boost::intrusive_ptr.

3 голосов
/ 14 мая 2010

Я знаю, что это может быть не то, что вам нужно, а просто включить ATLBase.h, а затем использовать шаблон CComPtr.

Затем вы просто используете

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

Затем вы можете скопировать его в другой CComPtr, и он обрабатывает все AddRefs и Releases для вас. Очень полезный шаблон класса.

2 голосов
/ 14 мая 2010

Не является ли спецификатор соглашения о вызовах проблемой? Это будет хорошо?

void iUnk_delete(IUnknown* u) {
  u->Release();
}


return shared_ptr<IDirectDrawSurface>(dds, iUnk_delete);
...