如何将 void* 类型转换为点云指针

How to typecast void* to Point Cloud pointer

在点云库中,指向云的指针是这样创建的:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZ>)

我需要将 void* 类型转换为云指针。这个的语法是什么?

更具体地说,我正在尝试使用 shmat() 函数并将点云写入共享内存,因此需要转换为云指针。

提前致谢

...I need to typecast void* to a cloud pointer.

在我前段时间做的一些代码中,g++ v2.5.1 编译器接受以下...

 void* v_shm_data = < ret val from your  ::shmat() >
 //  shared memory attach to this process--^^^^^^^
 //  the os selects the memory address, and returns the void*

 assert(reinterpret_cast<void*>(-1) != v_shm_data);  // abort on error

 shm_data = static_cast<Shm_process_data*>(v_shm_data);
 //   my data type ---- ^^^^^^^^^^^^^^^^   ^^^^^^^^^^ --- void*

我的编码环境已经改变,所以我需要做一些工作来确认这仍然有效......抱歉。

注意 - shm_data 只是 POD ...没有容器或 stl,没有虚拟方法,没有指针(可能是偏移描述符)。

发送方:

void * pSharedMemory = ... ; // from wherever
pcl::PointCloud<pcl::PointXYZ>::Ptr ptr = ... ; // from wherever
memcpy ( pSharedMemory , static_cast<void const*>(ptr.get()) , sizeof(pcl::PointCloud<pcl::PointXYZ>) ) ;

接收方:

template <typename T> nothing ( T* ) { }

void * pSharedMemory = ... ; // from wherever
pcl::PointCloud<pcl::PointXYZ>::Ptr ptr ( static_cast<pcl::PointCloud<pcl::PointXYZ>*>(pSharedMemory) , &nothing<pcl::PointCloud<pcl::PointXYZ> > ) ; // sets the destructor to do nothing

此方法引用内存 shared_ptr 但不对其进行任何管理。这更像是一个兼容层。

另一种方式,在接收方:

void * pSharedMemory = ... ; // from wherever
pcl::PointCloud<pcl::PointXYZ> * pThing = static_cast<pcl::PointCloud<pcl::PointXYZ> > ( pSharedMemory ) ;
pcl::PointCloud<pcl::PointXYZ>::Ptr ptr = std::make_shared<pcl::PointCloud<pcl::PointXYZ> > ( *pThing ) ; // copies it

安全注意事项:

因为这取决于 pcl::PointCloud<pcl::PointXYZ> 是 POD 类型。您可以通过将其放在文件中的某处来确保此假设有效:

static_assert ( std::is_pod<pcl::PointCloud<pcl::PointXYZ> >::value ) ;

或者,如果您不使用 C++11:

BOOST_MPL_ASSERT (( boost::is_pod<pcl::PointCloud<pcl::PointXYZ> > )) ;

这将在编译时确保对象是 POD 类型;如果不是,则不能将其与共享内存一起使用。