如何在模板类中使用这些point类型?
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=271
由于PCL模块较多,并且是一个模板库,在一个源文件里包含很多PCL算法会减慢编译过程,在撰写本文档的时候,大多数C++编译器仍然没有很好的优化来处理大量模板文件,尤其是涉及优化(-O2或者-O3)问题的时候。为了使包含和链接到PCL库的用户代码编译速度提高,我们使用显示的模板实例化,最终编译链接的库包括了所有可能的模板实例——在这些组合中使PCL中已经定义的point类型所有的模板类都能够直接调用,不需要重新编译,这意味着一旦PCL编译成库,任何用户代码都不需要编译模板化代码,这样就加速了用户编译过程。这个是通过在头文件中首先声明了我们的类和方法,再在模板类实现头文件中进行实现,配置在源文件中进行显示的实例化,最后在编译链接时分别实例化。举一个例子:
// foo.h #ifndef PCL_FOO_ #define PCL_FOO_ template<typenamePointT> class Foo { public: void compute(const pcl::PointCloud<PointT> &input, pcl::PointCloud<PointT> &output); } #endif // PCL_FOO_
上面定义了模板类Foo,可以看到,它定义了方法和类,但是还没有实现任何功能。
// impl/foo.hpp #ifndef PCL_IMPL_FOO_ #define PCL_IMPL_FOO_ #include "foo.h" template<typename PointT>void Foo::compute(const pcl::PointCloud<PointT> &input, pcl::PointCloud<PointT> &output) { output=input; } #endif // PCL_IMPL_FOO_
上面定义了Foo::compute方法的模板实现, 这种定义通常不与用户代码混合。
// foo.cpp #include "pcl/point_types.h" #include "pcl/impl/instantiate.hpp" #include "foo.h" #include "impl/foo.hpp" // Instantiations of specific point types PCL_INSTANTIATE(Foo,PCL_XYZ_POINT_TYPES));
最后,上面展示了在PCL中是如何进行显示实例化的,宏PCL_INSTANTIATE仅仅检查给定的类型清单并为每一个类型创建对应一个类实例。pcl/include/pcl/impl/instantiate.hpp中有如下代码:
// PCL_INSTANTIATE: call to instantiate template TEMPLATE for all // POINT_TYPES #define PCL_INSTANTIATE_IMPL(r, TEMPLATE, POINT_TYPE) \ BOOST_PP_CAT(PCL_INSTANTIATE_, TEMPLATE)(POINT_TYPE) #define PCL_INSTANTIATE(TEMPLATE, POINT_TYPES) \ BOOST_PP_SEQ_FOR_EACH(PCL_INSTANTIATE_IMPL, TEMPLATE, POINT_TYPES);
PCL_XYZ_POINT_TYPES在这里(在pcl/include/pcl/impl/point_types.hpp中):
// Define all point types that include XYZ data #define PCL_XYZ_POINT_TYPES \ (pcl::PointXYZ) \ (pcl::PointXYZI) \ (pcl::PointXYZRGBA) \ (pcl::PointXYZRGB) \ (pcl::InterestPoint) \ (pcl::PointNormal) \ (pcl::PointXYZRGBNormal) \ (pcl::PointXYZINormal) \ (pcl::PointWithRange) \ (pcl::PointWithViewpoint) \ (pcl::PointWithScale)
实际上,如果你只是想给pcl::PointXYZ类型实例化Foo这一个实例类,你不需要使用宏,而只需要像下面这样简单地做:
注意:查看David Vandervoorde和Nicolai M. Josuttis所著的C++ Templates - The Complete Guide,可获得关于显示实例化的更多信息。
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版
// foo.cpp #include "pcl/point_types.h" #include "pcl/impl/instantiate.hpp" #include "foo.h" #include "impl/foo.hpp" template class Foo<pcl::PointXYZ>;