big*_*g-z 3 c++ boost bind shared-ptr
考虑一下我有以下几点struct:
struct IDirect3D
{
    IDirect3D() : ref_count_(0) {}
    unsigned long Release() { return --ref_count_; }
private:
    long ref_count_;
    ~IDirect3D() {}
};
我想shared_ptr在后面的代码(最小例子)中使用它:
int main()
{
    boost::shared_ptr<IDirect3D> ptr;
    IDirect3D* p = 0; // initialized somewhere
    ptr.reset( p, boost::mem_fn( &IDirect3D::Release ) );
    return 0;
}
这在大多数情况下都可以正常工作,但如果p等于,则可以使用0.我有以下要删除的删除器:
template<typename T, typename D>
inline void SafeDeleter( T*& p, D d ) 
{ 
    if ( p != NULL ) {
        (p->*d)();
        p = NULL;
    }
}
但是下面的代码给出了很多错误(看起来像转储整个bind.hpp):
ptr.reset( p, boost::bind( SafeDeleter, _1, &IDirect3D::Release ) );
我的使用有bind什么问题?
Release()来自IUnknown- 所以为什么不使用它:
void my_deleter(IUnknown* p) {
    // ...
}
ptr.reset(p, &my_deleter);
请注意,Boost intrusive_ptr在这里看起来更自然:
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);
你的实际问题可能是有一个非模板函数SafeDeleter- 要专门使用你必须使用的模板函数:
ptr.reset(p, boost::bind(&SafeDeleter<IDirect3D, ULONG (IDirect3D::*)()>, 
                         _1, &IDirect3D::Release));