当我使用 boost::bind 将参数绑定到函数时 - 它们何时被转换为函数所需的类型(如果可以隐式转换)?
它们如何存储在bind_t对象中?作为最初传递给绑定的类型还是作为函数签名所需的类型?
具体来说:
如果我有签名的功能
void SomeFun(SmartPointer<SomeType>)
我使用绑定作为
boost::bind(&SomeFun, somePtr)
where somePtr
属于类型SomeType*
,将bind_t
对象包含一个副本somePtr
存储为简单指针还是将其转换为SmartPointer<SomeType>
并存储为SmartPointer<SomeType>
?
有一个隐式强制转换SomeType*
to SmartPointer<SomeType>
。相对于boost::shared_ptr
this SmartPointer
在托管对象中使用引用计数器,这意味着SomeType
必须源自SmartPointed
.
这甚至不起作用,因为没有从 SomeType* 到共享指针的隐式转换或隐式构造函数。
你应该打电话
boost::bind(&SomeFun, boost::shared_ptr<SomeType>(somePtr))
如果 somePtr 是您刚刚用“new”分配的指针,并且预计稍后当共享指针的最后一个引用超出范围时将其删除。如果您不希望删除该指针,但知道它在调用时仍然有效,并且该函数必须采用shared_ptr,则可以使用无操作删除器来创建shared_ptr。无论哪种方式,它都是一个shared_ptr,而不是一个指针或weak_ptr 或您必须在此实例中传递的任何其他内容。
您说您的情况有所不同,因此我们必须查看您的实际情况或更接近的情况。
您可能会对传入的函数是类成员函数并且传入类实例(对象)作为参数之一的情况感到困惑。在这里你可以传入一个指针、一个引用或一个shared_ptr,如果函数是一个const方法,它可以是一个const引用(类似地指向const的指针或指向const的shared_ptr)。
这只是因为当函数是类成员函数时,所有这些都有不同的重载 boost::bind 。
如果转换是隐式的,则隐式转换将在调用函数时发生。 boost::bind 只是一个存储传入内容的模板。
如果第一个参数用于调用成员函数,则会发生一些神奇的事情。
请注意,有时 boost::bind 会在函数实际获取引用的地方存储 boost::ref 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)