閱讀209 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

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

運行結果如下:


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

#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];
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 CApply
{
public:
	float GetSum(T& t,float inpara)
	{
		return t.GetSum(inpara);
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	CIntArray intary;
	CFloatArray fltary;

	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;
	return 0;
}

程序運行結果為:


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


最後更新:2017-04-04 07:03:34

  上一篇:go Win 8狂想 走自己的路讓別的係統無路可走?
  下一篇:go Ubuntu真正挑戰的是誰?