我使用点 Cloud 工作很多,所以我使用了很多PCL和Eigen库 . PCL中的积分有.x .y和.z公共成员 . 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)和特征向量也有几种类型:Vector3d用于双精度,Vecto3f用于浮点数,两者都是Matrix类型的特化(见http://eigen.tuxfamily.org/dox/group__matrixtypedefs.html)
我想知道是否可以调用一些模板特化魔术咒语来避免这种情况,即它会检测点类型是否具有.x()或.x并适当使用 .
2 回答
如果你不想和SFINAE一起玩,你可以在PCL中使用漂亮的内置 Map 并使用特征投射功能
您可以执行以下操作,而不是构建
Eigen::Vector3d
类型并将其传递给f()
getVector3fMap()
适用于所有内置PCL类型 .要检测某个类是否具有某个名称的方法或成员变量,您可以使用经典的SFINAE方法:
哪个可以在一个很小的测试套件中测试:
哪个输出:
然后,您可以将其与
std::enable_if
一起使用,以编写特定于每种类型的函数或结构的变体 . 您还可以使用logical operators in std::enable_if's condition创建所需条件的任意组合 .在与上面相同的测试框架中的一个愚蠢的例子:
哪个输出:
这应该有希望为您提供创建通用框架所需的所有工具 . 因为一切都是模板化的,所以大多数都应该被编译器优化掉,并且最终效率相当高 .
所有在Linux上都在GCC 4.8.2中进行过测试,但它应该适用于任何C 11编译器 .