如何在模板类中使用这些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>;
最新文章
- deiban8 sourcelist
- Holographic Remoting
- Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!
- Atiti &#160;attilax主要成果与解决方案与案例rsm版 v2
- oneM2M启动Release 3标准化,华为引领物联网技术布局
- 关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究 转载
- ios 打包
- file operation note
- Ajax 异步调用代码
- 15_采用Pull解析器解析和生成XML内容
- 写了交互给后台后来不能用?bug多多多又找不到文件效率低?工作流程帮你优化起来~~~~
- 基于Http替补新闻WebService数据交换
- 【JAVASCRIPT】React学习-组件生命周期
- c++ 实现哈夫曼树中遇见的问题
- 《R数据挖掘入门》彩色插图(第8章)
- [转帖] 从零开始编写自己的C#框架(27)——什么是开发框架
- Tomcat数据源的原理,配置及使用(JNDI)
- 如何在jsp和html页面上获取当前时间
- idea编辑区光标问题
- 软工团队 - 预则立&;&;他山之石
热门文章
- python 基础 1.5 python数据类型(四)--字典常用方法示例
- MongoDB的CRUD操作(java Util )
- ajax学习笔记(3)--$.get()方法
- 关于dubbo的负载均衡
- 常见寄存器以及常见汇编指令,常见爆破指令 good
- 题解 P3389 【【模板】高斯消元法】
- 我的Java开发学习之旅------>Java使用ObjectOutputStream和ObjectInputStream序列号对象报java.io.EOFException异常的解决方法
- Bitmaps
- selenium超时设置
- 数据解析,懒加载,代理ip