boost::bind 何时将参数强制转换为所需类型?

2024-01-03

当我使用 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(使用前将#替换为@)

boost::bind 何时将参数强制转换为所需类型? 的相关文章

随机推荐