1. 일반 프로그래밍
일반 프로그래밍: 유형에 독립적인 일반 코드를 작성하는 것은 코드 재사용의 수단입니다. 템플릿은 일반 프로그래밍의 기초입니다.
예를 들어, 활자인쇄는 틀을 제공하고 그 틀에 따라 다양한 문자를 인쇄하는 방식이다.
일반 프로그래밍은 유사한 패턴을 따르며 컴파일러가 자동으로 다양한 함수나 클래스를 생성하는 데 기반이 되는 템플릿을 제공합니다.
2. 기능 템플릿
2.1 함수 템플릿이 있는 이유는 무엇입니까?
C 언어에서 두 개의 정수를 교환하거나, 두 개의 부동 소수점 숫자를 교환하거나, 사용자 정의 유형을 교환하려면 수동으로 n 함수를 직접 작성해야 합니다! ! ! 그리고 함수마다 함수명이 다릅니다! ! !
void SwapInt(int& a,int& b)
{
int c = a;
a = b;
b = c;
}
void SwapDouble(double& a, double& b)
{
double c = a;
a = b;
b = c;
}
int main()
{
int a1 = 1, b1 = 2;
SwapInt(a1, b1);
cout << a1 << " " << b1 << endl;
double a2 = 1.1, b2 = 2.2;
SwapDouble(a2, b2);
cout << a2 << " " << b2 << endl;
return 0;
}
여러 함수를 작성하는 대신 하나의 함수(템플릿)만 작성하여 다양한 타입의 교환을 완료할 수 있는 방법이 없을까요? 이때 함수 템플릿이 무대에 등장합니다.
2.2 기능 템플릿 사용 방법
템플릿 형식:
템플릿<클래스 T1, 클래스 T2, 클래스 T3...>
반환값 함수명(함수 매개변수) { 함수 본문 }
template<class T>
void Swap(T &a ,T &b)
{
T c = a;
a = b;
b = c;
}
int main()
{
int a1 = 1, b1 = 2;
Swap(a1, b1);
cout << a1 << " " << b1 << endl;
double a2 = 1.1, b2 = 2.2;
Swap(a2, b2);
cout << a2 << " " << b2 << endl;
return 0;
}
2.3 함수 템플릿의 인스턴스화
여기서 제공하는 스왑은 실제 함수가 아닌 함수 템플릿일 뿐입니다.다른 유형의 매개변수와 함께 함수 템플릿을 사용하는 경우, < /span>라고 합니다! ! ! 함수 템플릿 인스턴스화 컴파일러는 해당 함수를 자동으로 생성해야 하며, 이를
템플릿 인스턴스화는명시적 인스턴스화와암시적 인스턴스화로 구분됩니다.
2.3.1 암시적 인스턴스화
컴파일러는 실제 매개변수 유형을 식별하고 템플릿 매개변수의 유형을 추론합니다.
template<class T>
void Swap(T &a ,T &b)
{
T c = a;
a = b;
b = c;
}
int main()
{
int a1 = 1, b1 = 2;
Swap(a1, b1);
double a2 = 1.1, b2 = 2.2;
Swap(a2, b2);
return 0;
}
T의 유형은 전달된 매개변수에서 추론됩니다. 이를 암시적 인스턴스화라고 합니다.
2.3.2 디스플레이 인스턴스화
함수 이름 뒤의 <>에 전달된 특정 유형을 지정하세요.
template<class T>
void Swap(T &a ,T &b)
{
T c = a;
a = b;
b = c;
}
int main()
{
int a1 = 1, b1 = 2;
Swap<int>(a1, b1);
double a2 = 1.1, b2 = 2.2;
Swap<double>(a2, b2);
return 0;
}
3. 클래스 템플릿
3.1 클래스 템플릿이 필요한 이유는 무엇입니까?
두 개의 스택이 필요한 경우(한 스택은 int 유형을 저장하고 다른 하나는 double 유형을 저장함) 우리는 두 개의 서로 다른 클래스만 작성할 수 있습니다. 이 두 클래스는 클래스 이름이 다르지만 유형을 제외하고 클래스의 다른 모든 것은 동일합니다. !!!
class StackInt
{
public:
StackInt(int capacity = 4)
{
_a = new int[capacity];
_top = 0;
_capacity = capacity;
}
~StackInt()
{
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
private:
int* _a;
int _top;
int _capacity;
};
class StackDouble
{
public:
StackDouble(int capacity = 4)
{
_a = new double[capacity];
_top = 0;
_capacity = capacity;
}
~StackDouble()
{
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
private:
double* _a;
int _top;
int _capacity;
};
int main()
{
StackInt st1;
StackDouble st2;
return 0;
}
이때 이 문제를 해결하려면 클래스 템플릿을 사용해야 합니다.
3.2 클래스 템플릿을 사용하는 방법
템플릿 형식:
템플릿<클래스 T1, 클래스 T2, 클래스 T3...>
class 클래스 이름 { 멤버 함수 및 멤버 변수 };
template<class T>
class Stack
{
public:
Stack(int capacity = 4)
{
_a = new T[capacity];
_top = 0;
_capacity = capacity;
}
~Stack()
{
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
private:
T* _a;
int _top;
int _capacity;
};
int main()
{
Stack<int> st1;
Stack<double> st2;
return 0;
}
3.3 클래스 템플릿의 인스턴스화
스택은 클래스 이름입니다.
Stack