天天看點

traits技術詳解

STL模版庫非常強調軟體的複用,traits技術是采用的重要手段。traits提取不同類的共性,以便能統一處理。traits技術依靠顯示模版特殊化來把代碼中因類型不同而發生變化的片段拖出來,用統一的接口來包裝。這個接口可以包含一個C++類所能包含的任何東西,如内嵌類型、成員函數、成員變量。作為客戶的模版代碼,可以通過traits模版類所公開的接口來簡潔通路。

示例:一直整形數組類CIntArray,浮點數組類CFloatArray,求整形或浮點數組的和乘以相應倍數并輸出。代碼如下:

#include "stdafx.h"  

#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];  

    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];  

int _tmain(int argc, _TCHAR* argv[])  

    CIntArray intary;  

    CFloatArray fltary;  

    cout<<"3 times of sum of int array is"<<intary.GetSum(3)<<endl;  

    cout<<"3.2 times of sum of float array is"<<fltary.GetSum(3.2f)<<endl;  

    return 0;  

}  

運作結果如下:

traits技術詳解

通過對上面的代碼進行分析,CintArray、CFloatArray功能相似,在main函數中都是通過調用兩個類的GetSum函數完成。 那麼可以通過設計一個類的接口來完成上述功能。

template<class T>  

class CApply  

    float GetSum(T& t,float inpara)  

        return t.GetSum(inpara);  

    CApply<CIntArray> c1;  

    CApply<CFloatArray> c2;  

    cout<<"3 times of sum of int array is"<<c1.GetSum(intary,3)<<endl;  

    cout<<"3.2 times of sum of float array is"<<c2.GetSum(fltary,3.2f)<<endl;  

程式運作結果為:

traits技術詳解

通過對上面的代碼進行分析,CintArray、CFloatArray功能相似,在main函數中都是通過調用兩個類的GetSum函數完成。 那麼可以通過設計一個類的接口來完成上述功能。如何解決輸入、輸出參數類型的不同呢?這就需要本文介紹的traits技術了。

繼續閱讀