Template
•テンプレートは汎用プログラミングの基礎であり、特定のタイプに依存しないコードを記述することができます.
•各コンテナには「ベクトル」などの定義がありますが、プログラマは「ベクトル」や「ベクトル•プログラマは、テンプレートを使用して関数とクラスを定義できます.
•関数テンプレート自体は、タイプ、関数、またはその他のオブジェクトではありません.
•テンプレート定義のみを含むソースファイルはコードを生成しません.
•コードを表示するには、テンプレートをインスタンス化する必要があります.コンパイラが実際の関数を作成できるように、テンプレート引数を指定する必要があります.
結果:
processing abs : 10
processing abs : 10.1
processing abs : 2.3
テンプレートを具体的に定義すると、エラーを防止できます.
•テンプレート関数を定義するようにテンプレートクラスを定義できます.
•テンプレートクラスは、単一のデータ型の特定の色ではなく、アルゴリズム思考を重視します.
•キーワード「class」と「typename」が使用可能です.
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
•クラス外でメンバー関数を定義する場合は、各メンバー関数の前にテンプレートキーを繰り返し使用する必要があります.
•クラスのメンバーシップを指定する場合は、テンプレートクラスとして明示的に記述する必要があります.
•各コンテナには「ベクトル」などの定義がありますが、プログラマは「ベクトル
🔑関数テンプレート
•関数テンプレート自体は、タイプ、関数、またはその他のオブジェクトではありません.
•テンプレート定義のみを含むソースファイルはコードを生成しません.
•コードを表示するには、テンプレートをインスタンス化する必要があります.コンパイラが実際の関数を作成できるように、テンプレート引数を指定する必要があります.
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)
Reference
この問題について(Template), 我々は、より多くの情報をここで見つけました https://velog.io/@leeyjwinter/Templateテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol