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

模板是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;
}




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
很高兴为您解答问题!以下是有关 C++ 模板的详细说明: 1. 函数模板函数模板是指能够生成通用函数的一种特殊函数函数模板函数名后必须加上 < > 以表示被封装的数据类型,如: ``` template <typename T> T getMax(T a, T b) { return a > b? a : b; } ``` 其,typename 关键字和 class 关键字是等价的,两者都可以用来声明类型形参。 2. 类模板:类模板是指能够生成通用类的一种特殊类。类模板的类名后必须加上 < > 以表示被封装的数据类型,如: ``` template <typename T> class Stack { private: T data[100]; int top; public: Stack(); bool isEmpty(); bool isFull(); void push(T); void pop(); T top(); }; ``` 在类模板定义的成员函数,通常也需要在其函数名后加上 < >,以表示该函数采用的数据类型。 3. 模板特化:模板特化是指针对特定数据类型提供定制的模板模板特化比通用模板优先级更高,如果在调用模板函数时匹配到了特化模板,则优先使用特化模板,如: ``` template <typename T> void fun(T a) { cout << "This is a general template" << endl; } template <> void fun<int>(int a) { cout << "This is a special template for int" << endl; } ``` 在调用 fun(1) 时,由于匹配到了特化模板 fun<int>(),因此输出结果为 "This is a special template for int"。 4. 模板偏特化:模板偏特化是指能够提供针对部分数据类型的特化模板模板偏特化是在通用模板基础上的进一步细化,可以通过指定部分类型参数来完成,如: ``` template<typename T1, typename T2> class MyClass {}; template<typename T> class MyClass<T, int> {}; ``` 这里的偏特化,是将所有的 T2 定义为 int 类型,也就是只对 T1 进行特化。 以上是对函数模板、类模板模板特化、模板偏特化的详细说明。希望以上的解答能够为您提供帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值