c++ - 绑定(bind)两个参数

标签 c++ boost bind shared-ptr

考虑我有以下结构:

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));

关于c++ - 绑定(bind)两个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3465268/

相关文章:

c++ - 如何使函数在不同时间调用时返回不同的字符串? C++

c++ - 什么时候可以在 C++ 中比较指向同一对象的指针?

c++ - 如何在 Boost.Process 0.5 中将程序终止与流结束绑定(bind)?

c++ - 当 C++ 流打开失败时,您可以获得特定的错误情况吗?

c++ - 如何从 const boost::multi_array 获取特定元素

linux - 使用 boost 和 C++11 构建进程崩溃

c++ - Boost::Asio - 抛出 get_io_service 异常

c++ - 外部参照环绕错误 : 'void' function returning a value

php - 当我在bind_param上工作时,我正在用php的OOPs概念制作一个用于图像上传的函数,我不知道图像s或i

dns - 使用 rndc 进行主/从复制