2011-01-12 28 views
2

当我使用boost :: bind绑定参数到一个函数 - 它们何时被转换为函数所需的类型(如果隐式转换是可能的话)?什么时候boost :: bind将参数转换为所需的类型?

它们是如何存储在bind_t对象中的?作为最初传递给绑定的类型还是作为函数签名所需的类型?

具体来说:

如果我有签名

void SomeFun(SmartPointer<SomeType>) 

的函数,并且我使用绑定作为

boost::bind(&SomeFun, somePtr) 

其中somePtrSomeType*类型的,将在bind_t对象包含存储为简单指针的somePtr的副本,或将它转录到SmartPointer<SomeType>并成为s作为SmartPointer<SomeType>

有一个从SomeType*SmartPointer<SomeType>的隐式转换。与boost::shared_ptr相反,此SmartPointer在受管理对象中使用参考计数器,这意味着SomeType必须从SmartPointed派生。

回答

2

这不会起作用,因为SomeType *没有隐式转换或隐式构造函数给shared_ptr。

你应该叫

boost::bind(&SomeFun, boost::shared_ptr<SomeType>(somePtr)) 

如果somePtr是你刚才用“新”分配的指针和期望时的shared_ptr的最后一个引用超出范围稍后删除。如果您不希望指针被删除,但您知道它在调用时仍然有效,并且该函数必须采用shared_ptr,则可以使用无操作删除器来创建shared_ptr。无论哪种方式,它是一个shared_ptr,而不是一个指针或一个weak_ptr或其他任何你必须在这个实例中传入的东西。

你说你的情况是不同的,所以我们将不得不看到你的实际情况或一个更接近匹配。

您可能会对传入的函数是类成员函数并且将类实例(对象)作为参数之一传入的情况感到困惑。在这里你可以传入一个指针,一个引用或者一个shared_ptr,并且如果这个函数是一个const方法的话,它可以是一个const引用(类似于指向const的const指针或者指向const的shared_ptr)。

这只是因为当函数是一个类成员函数时,对于所有这些boost :: bind都有不同的重载。

如果转换是隐式的,隐式转换将在函数被调用时发生。 boost :: bind只是一个存储传入的模板。 如果第一个参数用于调用成员函数,会发生一些魔法。

请注意,有时boost :: bind将存储一个boost :: ref,其中函数实际上需要引用。

+0

我已经更新了我的问题更加紧密地代表我的实际情况。 – 2011-01-12 13:21:50

0

它们存储为传入的类型。

当您调用bind返回的函数对象时,转换将发生,而不是在执行绑定时发生。

有shared_ptr的构造不被标记为明确:

template<class Y> 
explicit shared_ptr(Y * p): px(p), pn(p) // Y must be complete 

那么你就已经结束了与给定的boost ::绑定此行为的有趣的错误。如果你只有一次调用函子,那么一切都会好的,你的对象将被删除。如果你已经多次调用过它,那么你将会有一个double free和after-after-free的bug,因为你第二次从你的指针构造了一个shared_ptr,你将使用一个已经被释放的指针。

(我只是问了related question为什么的boost ::绑定是这种方式实现)

相关问题