我有这些话:
typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...
我希望能够做到这样的事情:
A_SPtr instance = (void*)(var);
我该怎么办? 另外,我怎样才能将另一种方式从shared_ptr转换为void *?
答案 0 :(得分:6)
只需指向指向void *
的共享指针的指针。
shared_ptr
至void *
:
f (reinterpret_cast<void *>;(&A_SPtr));
void *
返回shared_ptr
:
A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
注意:这会将指针传递给指向线程的共享指针。如果共享指针在线程函数的生命周期中不存在,则这将不起作用 - 否则,线程将具有指向不再存在的对象(共享指针)的指针。如果您无法满足该要求,请在线程完成后将指针传递给 new shared_ptr和delete
。 (或者使用直接使用共享指针的boost:bind
。)
答案 1 :(得分:0)
只要您确定可以假定f中传递给您的void*
的所有权,void*
实际上是指A
个对象,而您知道正确的清理方法,然后你可以继续使用智能指针来承担所有权:
typedef boost::shared_ptr<A> A_SPtr;
void *f(void *var){
A_SPtr instance(static_cast<A*>(var));
}
编辑:问题尚不清楚,但有些评论表明您实际上试图通过使用void*
的“通用”界面传递智能指针。您可以按照与任何类型相同的方式执行此操作:
void *f(void *var){
A_SPtr *instance = static_cast<A_SPtr *>(var);
}
你传递指针如下:
A_SPtr a;
f(&a);
与任何指针一样,您必须确保对象的生命周期足以使指针在f
收到时有效。