我们都知道STL标准模板库非常强调软件的复用,traits技术是采用的重要手段。traits的中文意思就是特性,traits就像特性萃取机,提取不同类的共性,以便能统一处理。traits依靠显示模板特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装。这个接口可以包含一个C++类所能包含的任何东西,如内嵌类型、成员函数、成员变量。作为客户的模板代码,可以通过traits模板类所公开的接口来间接访问。
下面是一个简单实例:已知整型数组类CIntArray,浮点数组类CFloatArray,求整型或浮点数组的和乘于相应的倍数并输出。
#include<iostream>
using namespace std;
class CIntArray
{
private:
int a[10];
public:
CIntArray()
{
for(int i=0;i<10;i++)
{
a[i]=i+1;
}
}
int GetSum(int times);
};
int CIntArray::GetSum(int times)
{
int sum=0;
for(int i=0;i<10;i++)
{
sum+=a[i];
}
return sum*times;
}
class CFloatArray
{
private:
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<CIntArray>
{
public:
typedef int resulttype;
typedef int inputpara;
};
template<>
class NumTraits<CFloatArray>
{
public:
typedef float resulttype;
typedef float inputpara;
};
//提供公共接口
/*
template<class T>
class CApply
{
public:
//此法虽从结果上看,没有问题,但是从严密角度上不够严密。
//如果问题复杂了,结果可能就不正确了。
float GetSum(T& t,float inpara)
{
return t.GetSum(inpara);
}
};
*/
/*
template<class T>
class CApply
{
public:
NumTraits<T>::resulttype GetSum(T& t,NumTraits<T>::inputpara inpara)
{
return t.GetSum(inpara);
}
};
*/
//进一步简化函数形式
template<class T>
class CApply
{
public:
typedef NumTraits<T>::resulttype result;
typedef NumTraits<T>::inputpara input;
result GetSum(T& t, input inpara)
{
return t.GetSum(inpara);
}
};
void main()
{
CIntArray intary;
CFloatArray fltary;
// cout<<"整型数组的和3倍是:"<<intary.GetSum(3)<<endl;
// cout<<"浮点数组和3.2倍是:"<<fltary.GetSum(3.2f)<<endl;
CApply<CIntArray> c1;
CApply<CFloatArray> c2;
cout<<"整型数组的和3倍是:"<<c1.GetSum(intary,3)<<endl;
cout<<"浮点数组和3.2倍是:"<<c2.GetSum(fltary,3.2f)<<endl;
}
using namespace std;
class CIntArray
{
private:
int a[10];
public:
CIntArray()
{
for(int i=0;i<10;i++)
{
a[i]=i+1;
}
}
int GetSum(int times);
};
int CIntArray::GetSum(int times)
{
int sum=0;
for(int i=0;i<10;i++)
{
sum+=a[i];
}
return sum*times;
}
class CFloatArray
{
private:
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<CIntArray>
{
public:
typedef int resulttype;
typedef int inputpara;
};
template<>
class NumTraits<CFloatArray>
{
public:
typedef float resulttype;
typedef float inputpara;
};
//提供公共接口
/*
template<class T>
class CApply
{
public:
//此法虽从结果上看,没有问题,但是从严密角度上不够严密。
//如果问题复杂了,结果可能就不正确了。
float GetSum(T& t,float inpara)
{
return t.GetSum(inpara);
}
};
*/
/*
template<class T>
class CApply
{
public:
NumTraits<T>::resulttype GetSum(T& t,NumTraits<T>::inputpara inpara)
{
return t.GetSum(inpara);
}
};
*/
//进一步简化函数形式
template<class T>
class CApply
{
public:
typedef NumTraits<T>::resulttype result;
typedef NumTraits<T>::inputpara input;
result GetSum(T& t, input inpara)
{
return t.GetSum(inpara);
}
};
void main()
{
CIntArray intary;
CFloatArray fltary;
// cout<<"整型数组的和3倍是:"<<intary.GetSum(3)<<endl;
// cout<<"浮点数组和3.2倍是:"<<fltary.GetSum(3.2f)<<endl;
CApply<CIntArray> c1;
CApply<CFloatArray> c2;
cout<<"整型数组的和3倍是:"<<c1.GetSum(intary,3)<<endl;
cout<<"浮点数组和3.2倍是:"<<c2.GetSum(fltary,3.2f)<<endl;
}