C++ 绑定两个参数

C++ 绑定两个参数,c++,boost,bind,shared-ptr,C++,Boost,Bind,Shared Ptr,假设我有以下struct: struct IDirect3D { IDirect3D() : ref_count_(0) {} unsigned long Release() { return --ref_count_; } private: long ref_count_; ~IDirect3D() {} }; 我想在下面的代码中使用shared\u ptr来实现它(最简单的示例): 但是下面的代码给出了很多错误(看起来它转储了整个bind.hpp): 我使用

假设我有以下
struct

struct IDirect3D
{
    IDirect3D() : ref_count_(0) {}
    unsigned long Release() { return --ref_count_; }
private:
    long ref_count_;
    ~IDirect3D() {}
};
我想在下面的代码中使用
shared\u ptr
来实现它(最简单的示例):

但是下面的代码给出了很多错误(看起来它转储了整个
bind.hpp
):

我使用
bind
有什么问题?

Release()
来自
IUnknown
-为什么不直接使用它呢:

void my_deleter(IUnknown* p) {
    // ...
}

ptr.reset(p, &my_deleter);
请注意,Boost还有一个更自然的功能:

void intrusive_ptr_add_ref(IUnknown* p) { p->AddRef (); }
void intrusive_ptr_release(IUnknown* p) { p->Release(); }

boost::intrusive_ptr<IDirect3D> d3d(...);
IDirect3D* p = 0;
d3d.reset(p);

谢谢你的回答。但是带有
bind
的表达式在使用模板参数时看起来很糟糕。更好的是,我只需编写自己的deleter,调用
Release
@Kirill:根据ctor/dtor/
reset()
的定义,我不明白为什么需要进行检查。(为未决定的来回滚动感到抱歉)
ptr.reset( p, boost::bind( SafeDeleter, _1, &IDirect3D::Release ) );
void my_deleter(IUnknown* p) {
    // ...
}

ptr.reset(p, &my_deleter);
void intrusive_ptr_add_ref(IUnknown* p) { p->AddRef (); }
void intrusive_ptr_release(IUnknown* p) { p->Release(); }

boost::intrusive_ptr<IDirect3D> d3d(...);
IDirect3D* p = 0;
d3d.reset(p);
ptr.reset(p, boost::bind(&SafeDeleter<IDirect3D, ULONG (IDirect3D::*)()>, 
                         _1, &IDirect3D::Release));