我有这些行:
typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...
我希望能够做这样的事情:
A_SPtr instance = (void*)(var);
我该怎么做?另外,我如何才能将含义从 shared_ptr 转换为 void*?
我有这些行:
typedef boost::shared_ptr<A> A_SPtr;
void *f(void* var){ ...
我希望能够做这样的事情:
A_SPtr instance = (void*)(var);
我该怎么做?另外,我如何才能将含义从 shared_ptr 转换为 void*?
只需将指向和来自的共享指针的指针强制转换为void *
.
shared_ptr
至void *
:
f (reinterpret_cast<void *>;(&A_SPtr));
void *
回到shared_ptr
:
A_SPtr instance = * reinterpret_cast(boost::shared_ptr<A>*)(var);
注意:这会将指向共享指针的指针传递给线程。如果共享指针在线程函数的生命周期内不存在,这将不起作用——否则,线程将拥有一个指向不再存在的对象(共享指针)的指针。如果您不能满足该要求,请在线程完成时将指针传递给新的shared_ptr 和delete
它。(或使用boost:bind
which 直接与共享指针一起使用。)
只要您确定可以假定void*
f 中传递给您的所有权是可以的,void*
并且实际上确实引用了一个A
对象,并且您知道清理的正确方法,那么您就可以继续使用 smart指向所有权的指针:
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
接收到它时有效。