zoukankan      html  css  js  c++  java
  • 如何在模板类中使用这些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>;
  • 相关阅读:
    Java异常处理和设计
    一次qps测试实践
    Alternate Task UVA
    Just Another Problem UVA
    Lattice Point or Not UVA
    Play with Floor and Ceil UVA
    Exploring Pyramids UVALive
    Cheerleaders UVA
    Triangle Counting UVA
    Square Numbers UVA
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8596157.html
Copyright © 2011-2022 走看看