我经常使用点云,因此我使用了很多 PCL 和 Eigen 库。 PCL 中的点有 .x .y 和 .z 公共(public)成员。 Eigen 中的点有 .x() .y() 和 .z()
我经常发现自己为一种点类型编写一个函数,然后通过创建一个临时点来调用它以从一种类型转换为另一种类型:
例如
void f(const Eigen::Vector3d &p) { ... }
pcl::PointXYZ p;
f(Eigen::Vector3d(p.x, p.y, p.z);
为了使问题更加复杂,PCL 点有多种类型:XYZ、XYZRGB、XYZN 等(请参阅 http://pointclouds.org/documentation/tutorials/adding_custom_ptype.php),特征向量也有多种类型:用于 double 的 Vector3d 和用于 float 的 Vecto3f,两者都是矩阵类型的特化(参见 http://eigen.tuxfamily.org/dox/group__matrixtypedefs.html )
我想知道是否可以调用一些模板专门化魔法咒语来避免这种情况,即它会检测点类型是否具有 .x() 或 .x 并适当使用。
最佳答案
如果您不想为 SFINAE 烦恼,您可以使用 PCL 中漂亮的内置贴图并使用 Eigen 转换函数
您可以执行以下操作,而不是构造 Eigen::Vector3d
类型并将其传递给 f()
pcl::PointXYZ p;
f(p.getVector3fMap().cast<double>);
getVector3fMap()
适用于所有内置 PCL 类型。
关于c++ - 具有 x、y、z 的点和具有 x()、y()、z() 的点的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27322931/