【C++ 模板】 如何根据模版中数据类型做对应操作?
2017-09-13 19:27
274 查看
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
模板是一种对类型进行参数化的工具;
通常有两种形式:函数模板和类模板;
函数模板针对仅参数类型不同的函数;
类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于第二个值。在实际中,我们可能想要定义多个函数,每个函数比较一种给定类型的值。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
1、函数模板的格式:
template <class 形参名,class 形参名,......> 返回类型函数名(参数列表)
{
函数体
}
模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板的列表,用< >包围起来。class可以用typename 关见字代替,在这里typename和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。
注意:对于函数模板而言不存在 h(int,int) 这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行 h(2,3) 这样的调用,或者int
a, b; h(a,b)。
2、类模板的格式为:
template<class 形参名,class 形参名,…> class 类名
{... };
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。
模板是一种对类型进行参数化的工具;
通常有两种形式:函数模板和类模板;
函数模板针对仅参数类型不同的函数;
类模板针对仅数据成员和成员函数类型不同的类。
使用模板的目的就是能够让程序员编写与类型无关的代码。假定我们希望编写一个函数来比较两个值,并指出第一个值是小于、等于还是大于第二个值。在实际中,我们可能想要定义多个函数,每个函数比较一种给定类型的值。
注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。
1、函数模板的格式:
template <class 形参名,class 形参名,......> 返回类型函数名(参数列表)
{
函数体
}
模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板的列表,用< >包围起来。class可以用typename 关见字代替,在这里typename和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。
注意:对于函数模板而言不存在 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++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
- VB.Net程序设计:拖放数据操作-如何拖放自定义的数据类型
- 如何根据判断数据的结果,改变DataGridView中对应记录的背景颜色?
- C#与C++数据类型对应表(搜集整理一)
- C++与.net数据类型对应表
- WPF中如何使用代码操作数据模板生成的控件
- C++中关于原始数据类型指针变量的new操作以及delete操作
- C++数据类型与C#对应关系 c#调用WINDWOS API时,非常有用
- c#中的数据类型如何与API中的类型定义对应!
- C++ 与 C#数据结构类型对应关系表 (转)
- C++与.net数据类型对应表
- java基本数据类型及其所对应对象的自动装箱,new,valueof操作研究
- C#与C++数据类型对应表(搜集整理一)
- WPF中如何使用代码操作数据模板生成的控件
- 在c++里面如何对读取出二进制数据进行操作
- C++与.net数据类型对应表
- C#与C/C++数据类型对应关系
- SQL与C++的数据类型对应关系(网上资料搜集整理)