Template


•テンプレートは汎用プログラミングの基礎であり、特定のタイプに依存しないコードを記述することができます.
•各コンテナには「ベクトル」などの定義がありますが、プログラマは「ベクトル」や「ベクトル•プログラマは、テンプレートを使用して関数とクラスを定義できます.

🔑関数テンプレート


•関数テンプレート自体は、タイプ、関数、またはその他のオブジェクトではありません.
•テンプレート定義のみを含むソースファイルはコードを生成しません.
•コードを表示するには、テンプレートをインスタンス化する必要があります.コンパイラが実際の関数を作成できるように、テンプレート引数を指定する必要があります.
return_type function_name(parameter list) 
 { 
  // body of function 
 }
  #include <iostream>

using namespace std;

//절댓값 출력 함수
template <typename T>
T user_abs(T a) {
	T ret;
	ret = a < 0 ? -a : a;
	cout << "processing abs : " << ret << endl;
	return ret;
}

int main() {
	int x1 = 10;
	float x2 = -10.1f;
	double x3 = -2.3;

	user_abs(x1);
	user_abs(x2);
	user_abs(x3);

	return 0;

}
  #include <iostream>

using namespace std;

//절댓값 출력 함수
template <typename T>
T user_abs(T a) {
	T ret;
	ret = a < 0 ? -a : a;
	cout << "processing abs : " << ret << endl;
	return ret;
}

int main() {
	int x1 = 10;
	float x2 = -10.1f;
	double x3 = -2.3;

	user_abs(x1);
	user_abs(x2);
	user_abs(x3);

	return 0;

}
テンプレートを使用して、オーバーロード中に操作することなく、上記のタイプの複数の関数を作成できます.
結果:
processing abs : 10
processing abs : 10.1
processing abs : 2.3

🔑複数の形状変数を受信する関数のテンプレート


テンプレートを具体的に定義すると、エラーを防止できます.
#include <iostream>

using namespace std;

template<typename T, typename Y>T avg(T a, Y b) {
	T ret = (a + b) / 2;
	cout << "avg = " << ret << endl;
	return ret;
}

int main() {
	int x1 = 3;
	int x2 = 0;
	float x3 = 4.12f;

	avg(x1, x2);
	avg(x2, x3);
	avg(x3, x2);

}

テンプレートテスト、swap関数の作成

#include <iostream>

using namespace std;

template<typename T, typename Y>void generic_swap(T &a, Y &b) {
	T temp;
	temp = a;
	a = b;
	b = temp;
}

int main() {
	int a = 57, b = 2;
	cout << "a=" << a << " b=" << b << endl;
	generic_swap(a, b);
	cout << "after swap: a=" << a << " b=" << b << endl;

	double c = 5.7;
	float d = 2.3f;
	cout << "c=" << c << " d=" << d << endl;
	generic_swap(c, d);
	cout << "after swap: c=" << c << " d=" << d << endl;
}

🔑クラステンプレート


•テンプレート関数を定義するようにテンプレートクラスを定義できます.
•テンプレートクラスは、単一のデータ型の特定の色ではなく、アルゴリズム思考を重視します.
•キーワード「class」と「typename」が使用可能です.
template <class T> class class_name {
};
class_name<type> obj_name;
#define MAX_SIZE 50
#include <iostream>

using namespace std;

template <typename TYPE>
class stack {
	TYPE data[MAX_SIZE];
	int nCount;

public:
	stack() { nCount = 0; }
	void add(TYPE in) {
		data[nCount++] = in;
		if (nCount == MAX_SIZE) {
			cout << "overflow : " << nCount << endl;
		}
	}
	TYPE pop() {
		if (nCount <= 0) {
			cout << "empty" << endl;
			return data[0];
		}
		else {
			return data[--nCount];
		}

	}
};

int main() {
	stack<int> stack1;
	stack<float> stack2;
	int i;
	float j;

	for (i = 0; i < 10; i++)
		stack1.add(i);

	for (j = 0; j < 10; j += .4)
		stack2.add(j);

	for (i = 0; i < 10; i++)
		cout << stack1.pop() << " ";
	cout << endl;
	for (i = 0; i < 10; i++)
		cout << stack2.pop() << " ";
}
結果:
9 8 7 6 5 4 3 2 1 0
10 9.6 9.2 8.8 8.4 8 7.6 7.2 6.8 6.4

接続リストテンプレート実装テスト

#include <iostream>

using namespace std;

template<typename TYPE>
class list {
	TYPE data;
	list* pNext;
public:
	list(int a) {
		data = a;
		pNext = NULL;
	}
	void add(list* pNode) {
		pNode->pNext = this;
		pNext = NULL;
	}
	list* getNext() {
		return pNext;
	}
	int getData() {
		return data;
	}
};

int main() {
	list<int> List1(0);
	list<int>* pNode, * pLast;

	pLast = &List1;
	for (int i = 1; i <= 10; i++) {
		pNode = new list<int>(i);
		pNode->add(pLast);
		pLast = pNode;
	}

	pNode = &List1;
	while (pNode) {
		cout << pNode->getData() << endl;
		pNode = pNode->getNext();
	}
}

🔑クラステンプレートのメソッド


•クラス外でメンバー関数を定義する場合は、各メンバー関数の前にテンプレートキーを繰り返し使用する必要があります.
•クラスのメンバーシップを指定する場合は、テンプレートクラスとして明示的に記述する必要があります.
template <typename T> class class_name { fuc1(T a);
};
…
template <typename T> T class_name<type> ::fuc1(T a)