【C++ 模板】 如何根据模版中数据类型做对应操作?

原创 2017年09月13日 19:27:59
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
模板是一种对类型进行参数化的工具;
  通常有两种形式:函数模板类模板
  函数模板针对仅参数类型不同的函数
类模板针对仅数据成员成员函数类型不同的类。


使用模板的目的就是能够让程序员编写与类型无关的代码。假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于第二个值。在实际中,我们可能想要定义多个函数,每个函数比较一种给定类型的值。

注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

1、函数模板的格式:

template <class 形参名class 形参名,......> 返回类型函数名(参数列表)

           {

      函数体

}

         模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板的列表,用< >包围起来。class可以用typename 关见字代替,在这里typenameclass没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。

注意:对于函数模板而言不存在 h(int,int) 这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行 h(2,3) 这样的调用,或者int a, b; h(a,b)

2、类模板的格式为:

      template<class  形参名class 形参名>   class 类名

{... };

类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

如何根据模板中数据类型做对应操作?

读取.txt文件中保存的Inertial measurement units (IMU)数据,并根据模版中数据类型做对应操作。这里存储了Gyroscope、Accelerometer和Magnetometer传感器的数据,还保存了采样时间的数据。怎么使用模板来读取这些存储在txt文件中的数据?

//sensor数据格式,每个sensor对应三个值
struct FORMAT
{
	double x;
	double y;
	double z;
};

//AHRS记录的数据
struct GYRODATA
{
	vector<FORMAT> gyroscopeData;//陀螺仪
	vector<FORMAT> accelerometerData;//加速度计
	vector<FORMAT> magnetometerData;//电子罗盘
	vector<double> timeData;
};

//根据模版中数据类型做对应操作
template <typename T>
struct Type2Type
{
    typedef T type;
};

template <typename T>
inline void sscanfData(const char* buf,T& tempData,Type2Type<double>)
{
	sscanf(buf,"%lf",&tempData);
}

template <typename T>
inline void sscanfData(const char* buf,T& tempData,Type2Type<FORMAT>)
{
	sscanf(buf,"%lf %lf %lf",&tempData.x,&tempData.y,&tempData.z);
}

//获取数据
template <class T>
void getDatafromTxt(const string filename,vector<T>& vecData)
{
	char buf[1024];                //临时保存读取出来的文件内容  
	string message;  
	ifstream infile;  
	infile.open(filename);  

	if(infile.is_open())          //文件打开成功,说明曾经写入过东西  
	{  
		while(infile.good() && !infile.eof())  
		{  
			memset(buf,0,1024);  
			infile.getline(buf,1024); 

			T tempData;
			sscanfData(buf,tempData,Type2Type<T>());//根据模版中数据类型做对应操作
			//sscanf(buf,"%lf %lf %lf",&tempData.x,&tempData.y,&tempData.z);
			vecData.push_back(tempData); 
		}  
		infile.close();  
	} 
	else cout<<"file open failed..."<<endl;
}

int main()
{
	//读取存储的sensor数据
	GYRODATA GyroData;
	getDatafromTxt("Gyroscope.txt",GyroData.gyroscopeData);
	getDatafromTxt("Accelerometer.txt",GyroData.accelerometerData);
	getDatafromTxt("Magnetometer.txt",GyroData.magnetometerData);
	getDatafromTxt("time.txt",GyroData.timeData);
	return 0;
}




c++函数模板做参数

模板分为函数模板和类模板 今天我们来说说函数模板。 一:函数模版定义形式 template 类型形式参数表为: typename T1,typenameT2,......typenameTn 或...
  • sum_TW
  • sum_TW
  • 2016年12月04日 16:14
  • 1752

java后台利用模板生成Word文档提供前台下载

java后台利用模板生成Word文档提供前台下载,freeMarker思路
  • u010251278
  • u010251278
  • 2016年11月25日 16:26
  • 14397

使用c++模板的优点和缺点

作为C++语言的新组成部分,模板引入了基于通用编程的概念。通用编程是一种无须考虑特定对象的描述和发展算法的方法,因此它与具体数据结构无关。但在决定使用C++模板之前,让我们分析一下使用模板的优缺点。 ...
  • chanlp129
  • chanlp129
  • 2014年03月16日 23:50
  • 3447

C++_class Template about Stack(使用类模板实现栈操作)

1.类模板定义: 在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢? 事实上class用于定义类,在模板引入...
  • shyjhyp11
  • shyjhyp11
  • 2017年04月15日 10:31
  • 208

C++模板的理解与使用

最近发现原来学的东西根本都不理解,所以本人正在恶补C++,把自己对C++中概念的最简单粗暴的理解写下来。 有问题的地方还请指出~随时更正 模板:顾名思义,就是为了方便以后使用而出现的东西,生活中的...
  • u012999985
  • u012999985
  • 2015年08月22日 11:01
  • 697

C++基础::变量模板(variable template)

既然允许C++模板类(class template)的存在,允许C++函数模板(function template)的存在,也应当允许变量模板(variable template)的存在。 引入变量模...
  • lanchunhui
  • lanchunhui
  • 2015年11月14日 13:24
  • 2760

[c++]栈模板的实现

头文件:StackTP.h #ifndef __STACKTP_H__ #define __STACKTP_H__ template class Stack { public: Stack();...
  • ZongYinHu
  • ZongYinHu
  • 2015年07月15日 09:49
  • 1233

关于用C++实现带约束条件的类型

关于用C++实现带约束条件的类型 Stroustrup在《The C++ programming language》一书(第三版25.6.1节)中已提及用C++模板来实现带约束条件的类型。下...
  • hk201406
  • hk201406
  • 2014年07月05日 13:25
  • 971

c++与python 数据类型对应

c++与python 数据类型对应
  • jacke121
  • jacke121
  • 2017年11月14日 23:30
  • 275

使用 XML 模板

使用 XML 模板 下面是模板的一般形式,显示了指定 SQL 查询和 XPath 查询的方式:        sql:xsl=XSL FileName >      ..    .....n     ...
  • onlytiancai
  • onlytiancai
  • 2004年08月05日 14:06
  • 1328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++ 模板】 如何根据模版中数据类型做对应操作?
举报原因:
原因补充:

(最多只允许输入30个字)