использование пользовательского удалителя для std :: shared_ptr для объекта direct3d11

Когда я использую std :: shared_ptr и мне нужен пользовательский удалитель, я обычно делаю функцию-член объекта, чтобы облегчить его уничтожение следующим образом:

class Example
{
public:
Destroy();
};

и затем, когда я использую общий ptr, я просто делаю это так:

std::shared_ptr<Example> ptr(new Example, std::mem_fun(&Example::Destroy));

Проблема в том, что сейчас я работаю с d3d11, и я хотел бы использовать функции ком релиза в качестве пользовательского удалителя std :: shared_ptr, вот так

std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun(&ID3D11Device::Release));

но я получаю эту ошибку:

error C2784: 'std::const_mem_fun1_t<_Result,_Ty,_Arg> std::mem_fun(_Result (__thiscall _Ty::* )(_Arg) const)' : could not deduce template argument for '_Result (__thiscall _Ty::* )(_Arg) const' from 'ULONG (__stdcall IUnknown::* )(void)'

и затем, когда я явно указываю параметры шаблона следующим образом:

std::shared_ptr<ID3D11Device> ptr(nullptr, std::mem_fun<ULONG, ID3D11Device>(&ID3D11Device::Release));

Я получаю эту ошибку,

error C2665: 'std::mem_fun' : none of the 2 overloads could convert all the argument types

Может кто-нибудь объяснить, почему я не могу использовать эту функцию в качестве средства удаления?

примечание: не предлагайте мне использовать CComPtr, я использую msvc ++ Express Edition: \

5

Решение

Как насчет этого?

std::shared_ptr<ID3D11Device> ptr(nullptr, [](ID3D11Device* ptr){ptr->Release();} );
13

Другие решения

Попробуй это

struct Releaser{
void operator()(ID3D11Device* p){
p->Release();

};

};std::shared_ptr<ID3D11Device> ptr(nullptr, Releaser());
0

По вопросам рекламы [email protected]