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>;
  • 相关阅读:
    管理反思(阶段)
    应用软件系统程序员的三个立面
    再优秀那么一点点
    TCP相关时延
    go wiki整理1
    慢就是快
    给自己一点机会
    竞争
    go mem
    币圈再次过年
  • 原文地址:https://www.cnblogs.com/flyinggod/p/8596157.html
Copyright © 2011-2022 走看看