STL标准模板库非常强调软件的复用,traits技术是非常重要的,traits是特性的意思,就像,特征萃取机,提取不同类的共性,以便能统一处理。traits依靠显式模板特殊化,把代码中因不同类型不同而发生变化的片段,拖出来,用统一的接口来包装。这个接口,可以包含一个C++类所能包含的任何东西,如内嵌函数,成员函数,成员变量。作为客户的模板代码,可以通过traits模板类所能公开的接口,来间接访问。
#include <iostream>
using namespace std;
class CInArray
{
int a[10];
public:
CInArray()
{
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 NumTraits
{
};
//模板特化
template <>
class NumTraits<CInArray>
{
public:
typedef int resulttype;
typedef int inputpara;
};
template <>
class NumTraits<CFloatArray>
{
public:
typedef float resulttype;
typedef float inputpara;
};
//统一模板调用类编制
template <class T>
class cApply
{
public:
//简化cApply函数中的定义,运用typedef进行定义
typedef typename NumTraits<T>::resulttype result;
typedef typename NumTraits<T>::inputpara input;
result GetSum(T& obj,input in)
{
return obj.GetSum(in);
}
// NumTraits<T>::resulttype GetNum(T& obj,NumTraits<T>::inputpara in)
// {
// return obj.GetSum(in);
// }
};
int main()
{
CInArray intary;
cApply<CInArray>c1;
cout<<"整型数组和3倍"<<c1.GetSum(intary,3);
return 0;
}
//输出结果:整型数组和3倍165