STL标准模板库非常强调软件的复用,traits的中文意思就是特性,traits就像特性萃取机,提取不同类的共性,以便能统一处理。traits依靠显式模板特殊化来把代码中因类型不同而发生变化的片段拖出来,用统一的接口来包装。
已知整型数组类CIntArray,浮点数组类CFloatArray,求整型或浮点数组的和乘以相应倍数并输出。
#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 NumTraits // 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:
typedef typename NumTraits<T>::resulttype result;
typedef typename NumTraits<T>::inputpara input;
result GetSum(T &obj, input in)
{
return obj.GetSum(in);
}
};
int main()
{
CIntArray intary;
CFloatArray floatary;
CApply<CIntArray> one;
CApply<CFloatArray> two;
cout << "整型数组和3倍是:" << one.GetSum(intary, 2) << endl;
cout << "浮点数组和3.2倍是:" << two.GetSum(floatary, 3.2f) << endl;
return 0;
}
(最近更新:2019年09月08日)