Traits技术
- traits=特性
提取不同类的共性,统一处理
依靠显示模板特殊化,把代码中因不同类型发生变化的片段提取出,用统一的接口来包装
接口可以为c++类所能包含的任何东西
客户通过traits模板类公开的接口来间接访问
- 代码示例
#include <iostream>
using namespace std;
class CIntArray
{
public:
CIntArray();
~CIntArray(){}
int GetSum(int times);
private:
int m_a[10];
};
CIntArray::CIntArray()
{
for (int i = 0; i < 10; i++) {
m_a[i] = i + 1;
}
}
int CIntArray::GetSum(int times)
{
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += m_a[i];
}
return sum * times;
}
class CFloatArray
{
public:
CFloatArray();
~CFloatArray(){}
float GetSum(float times);
private:
float m_a[10];
};
CFloatArray::CFloatArray()
{
for (int i = 0; i < 10; i++) {
m_a[i] = i + 1;
}
}
float CFloatArray::GetSum(float times)
{
float sum = 0.0;
for (int i = 0; i < 10; i++) {
sum += m_a[i];
}
return sum * times;
}
// traist模板类
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:
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 cInt;
CApply<CIntArray> ci;
std::cout << ci.GetSum(cInt, 3) << std::endl;
CFloatArray cFloat;
CApply<CFloatArray> cf;
std::cout << cf.GetSum(cFloat, 5.5) << std::endl;
return 0;
}
本文深入探讨了C++中的Traits技术,这是一种用于提取不同类共性的高级编程技巧。通过模板元编程,Traits技术允许开发者以统一的接口封装变化的代码片段,实现类型安全且灵活的代码复用。文章提供了详细的代码示例,包括如何为不同的类(如CIntArray和CFloatArray)创建特化的Traits模板类,以及如何使用CApply类作为对外接口调用这些类的方法。
248

被折叠的 条评论
为什么被折叠?



