traits技术,一个简单的例子(STL)

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
发布了30 篇原创文章 · 获赞 5 · 访问量 2222

猜你喜欢

转载自blog.csdn.net/weixin_44408476/article/details/104539599