2

当我使用 boost::bind 将参数绑定到函数时-它们何时转换为函数所需的类型(如果可以进行隐式转换)?

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

具体来说:

如果我有签名的功能

void SomeFun(SmartPointer<SomeType>)

我使用绑定作为

boost::bind(&SomeFun, somePtr)

somePtr类型在哪里SomeType*,该bind_t对象将包含somePtr存储为简单指针的副本还是将其强制转换为SmartPointer<SomeType>并存储为SmartPointer<SomeType>

SomeType*从to有一个隐式转换SmartPointer<SomeType>。与在托管对象boost::shared_ptrSmartPointer使用引用计数器相反,含义SomeType必须从SmartPointed.

4

2 回答 2

2

这甚至不起作用,因为没有从 SomeType* 到 shared_ptr 的隐式转换或隐式构造函数。

你应该打电话

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

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

您说您的情况不同,因此我们必须查看您的实际情况或更接近的情况。

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

这仅仅是因为当函数是类成员函数时,所有这些都有不同的重载来 boost::bind。

如果转换是隐式的,则隐式转换将在调用函数时发生。boost::bind 只是一个模板,用于存储传递给它的内容。如果第一个参数用于调用成员函数,则会发生一些魔术。

请注意,有时 boost::bind 会在函数实际获取引用的地方存储一个 boost::ref 。

于 2011-01-12T13:10:03.340 回答
0

它们存储为传入的类型。

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

如果 shared_ptr 构造函数没有被标记为显式:

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

那么鉴于 boost::bind 的这种行为,您最终会遇到一个有趣的错误。如果您只调用了一次仿函数,那么一切都会好起来的,您的对象将被删除。如果您多次调用它,那么您将遇到双重释放和释放后使用错误,因为您第二次从指针构造 shared_ptr 时,您将使用已被释放的指针。

(我刚刚问了一个相关的问题,为什么 boost::bind 是以这种方式实现的)

于 2012-06-29T02:08:21.760 回答