如何将 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) , ¬hing<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 类型;如果不是,则不能将其与共享内存一起使用。
在点云库中,指向云的指针是这样创建的:
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) , ¬hing<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 类型;如果不是,则不能将其与共享内存一起使用。