traits技术详解
STL模版库非常强调软件的复用,traits技术是采用的重要手段。traits提取不同类的共性,以便能统一处理。traits技术依靠显示模版特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装。这个接口可以包含一个C++类所能包含的任何东西,如内嵌类型、成员函数、成员变量。作为客户的模版代码,可以通过traits模版类所公开的接口来简洁访问。
示例:一直整形数组类CIntArray,浮点数组类CFloatArray,求整形或浮点数组的和乘以相应倍数并输出。代码如下:
#include "stdafx.h" #include<iostream> using namespace std; class CIntArray { int a[10]; public: CIntArray() { for(int i = 0;i < 10;i++) { a[i] = i+1; } } int GetSum(int times) { int sum=0; for(int i=0;i<10;i++) { sum+=a[i]; } return sum*times; } }; class CFloatArray { float f[10]; public: CFloatArray() { for(int i=1;i<=10;i++) f[i-1]=1.0f/i; } float GetSum(float times) { float sum=0.0f; for(int i=0;i< 10;i++) { sum+=f[i]; } return sum*times; } }; int _tmain(int argc, _TCHAR* argv[]) { CIntArray intary; CFloatArray fltary; cout<<"3 times of sum of int array is"<<intary.GetSum(3)<<endl; cout<<"3.2 times of sum of float array is"<<fltary.GetSum(3.2f)<<endl; return 0; }
运行结果如下:
通过对上面的代码进行分析,CintArray、CFloatArray功能相似,在main函数中都是通过调用两个类的GetSum函数完成。 那么可以通过设计一个类的接口来完成上述功能。
#include "stdafx.h" #include<iostream> using namespace std; class CIntArray { int a[10]; public: CIntArray() { for(int i = 0;i < 10;i++) { a[i] = i+1; } } int GetSum(int times) { int sum=0; for(int i=0;i<10;i++) { sum+=a[i]; } return sum*times; } }; class CFloatArray { float f[10]; public: CFloatArray() { for(int i=1;i<=10;i++) f[i-1]=1.0f/i; } float GetSum(float times) { float sum=0.0f; for(int i=0;i< 10;i++) { sum+=f[i]; } return sum*times; } }; template<class T> class CApply { public: float GetSum(T& t,float inpara) { return t.GetSum(inpara); } }; int _tmain(int argc, _TCHAR* argv[]) { CIntArray intary; CFloatArray fltary; CApply<CIntArray> c1; CApply<CFloatArray> c2; cout<<"3 times of sum of int array is"<<c1.GetSum(intary,3)<<endl; cout<<"3.2 times of sum of float array is"<<c2.GetSum(fltary,3.2f)<<endl; return 0; }
程序运行结果为:
通过对上面的代码进行分析,CintArray、CFloatArray功能相似,在main函数中都是通过调用两个类的GetSum函数完成。 那么可以通过设计一个类的接口来完成上述功能。如何解决输入、输出参数类型的不同呢?这就需要本文介绍的traits技术了。
最后更新:2017-04-04 07:03:34