C++模板内容学习(未完)

c++ 模板

    最近在项目中遇到写一个函数,相机拍的点云的单位为m,但是配准渲染的点云需要的点云单位是mm。
    所以需要写一个单位转换函数。但是点云又分pointsXYZ和PointsXYZRGB,所以想到了模板。
    首先复习一下模板。
  1. 模板编译
    当编译器遇到一个模板定义时,不生成代码。只有当我们实例出模板的一个特定版本时,编译器才会产生代码。

所以通常的类定义和函数声明放在头文件,普通函数和类成员函数的定义放在源文件。
而模板不同,为了生成一个实例化的版本,编译器需要掌握函数模板或者类模板成员函数的定义。所以模板的头文件既包含声明也包含定义。

  1. 函数模板
    模板类型参数
    函数模板就是一个公式。比如对于我们这里需要的点云转换:
template <typename T> void ConvertDataUnits(T cloud_view_xyzrgb_final)
{
	for (int j = 0; j < cloud_view_xyzrgb_final->size(); j++) {
		cloud_view_xyzrgb_final->points[j].x = cloud_view_xyzrgb_final->points[j].x * 1000.0;
		cloud_view_xyzrgb_final->points[j].y = cloud_view_xyzrgb_final->points[j].y * 1000.0;
		cloud_view_xyzrgb_final->points[j].z = cloud_view_xyzrgb_final->points[j].z * 1000.0;
			}
}

在调用的时候,函数会根据你传递的实参的类型进行自动转换。

//转换过来的点云带彩色通道
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_view_xyzrgb_pcl_in(new pcl::PointCloud<pcl::PointXYZRGB>);
//转换过来的点云不带彩色通道
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_view_xyz_pcl_in(new pcl::PointCloud<pcl::PointXYZ>);
ConvertDataUnits(cloud_view_xyzrgb_pcl_in);
ConvertDataUnits(cloud_view_xyz_pcl_in);			

非类型模板参数
分类型参数指的是一个值,当一个模板被实例化的时候,非类型参数被一个用户提供的或编译器推断出的值替代。必须是常量表达式
如比较字符串的函数

template <unsigned N,unsigned M> int compare(const char (&p1)[N],const char(&p2) [M])
{
	return strcmp(p1,p2);
}
compare("hi","moom");

  1. 类模板
    类模板是生成类的蓝图。编译器不能为类模板推断出模板参数类型。
    为了使用类模板,必须在尖括号内提供额外的信息。
template <typename T>class Bolb
{
	public:
		typedef T value_type;
		//构造函数略
		Bolb(std::initiallizer_list<T> i1);
		//类函数声明略
		std::shared_ptr<std::vector<T>>data;
	private:
	//定义一些私人的参数等	
}
//实例化
Bolb<int> ia;
Bolb<string> name;

在模板的作用域内引用模板类型。

//当我们实例化一个Blob的时候,就会使得data变成相应的类型
Bolb<string>;
//data就会变成shared_ptr<vector<>>

类模板的成员函数
在类外定义成员函数的时候必须也是用template,如

template <typename T> T& Bolb<T>::back(){};
template <typename T> T& Bolb<T>::pop_back(){};

猜你喜欢

转载自blog.csdn.net/m0_37668446/article/details/106965729