traitsテクノロジーの詳細

2241 ワード

STLテンプレートライブラリはソフトウェアの多重化を強調し,traits技術は採用の重要な手段である.traitsは異なるクラスの共通性を抽出し,統一的に処理できるようにした.traits技術は,表示テンプレートの特殊化によりコード中のタイプによって変化するセグメントをドラッグし,統一されたインタフェースで包装する.このインタフェースには、埋め込みタイプ、メンバー関数、メンバー変数など、C++クラスに含まれるものを含めることができます.お客様のテンプレートコードとして、traitsテンプレートクラスに公開されているインタフェースを使用して簡単にアクセスできます.
例:整形配列クラスCIntArray、浮動小数点配列クラスCFLoatArray、整形または浮動小数点配列の和に対応する倍数を乗じて出力します.コードは次のとおりです.
#include "stdafx.h"
#include

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<

実行結果は次のとおりです.
上のコードを解析することでCintArray,CFLoatArrayの機能は類似しており,main関数ではいずれも2つのクラスのGetSum関数を呼び出すことで完了する.このような機能は、クラスのインタフェースを設計することによって達成することができる.
#include "stdafx.h"
#include

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

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

	CApply c1;
	CApply c2;

	cout<

プログラムの実行結果は次のとおりです.
上のコードを解析することでCintArray,CFLoatArrayの機能は類似しており,main関数ではいずれも2つのクラスのGetSum関数を呼び出すことで完了する.このような機能は、クラスのインタフェースを設計することによって達成することができる.入出力パラメータのタイプの違いをどのように解決しますか?これは本稿で紹介するtraits技術が必要です.