템플릿(Template)은 제네릭 프로그래밍을 구현하기 위한 C++의 강력한 기능입니다.
template<typename T>
void Print(T a)
{
std::cout << a << std::endl;
}
구조:
template<typename T>: 템플릿 선언 부분입니다. T는 타입 파라미터로, 호출 시점에서 데이터 타입이 결정됩니다.typename 대신 class 키워드도 사용할 수 있습니다.Print 함수는 데이터 타입에 의존하지 않고 호출된 데이터 타입에 따라 동작합니다.사용 예시:
Print<int>(10); // 명시적으로 <int> 타입 지정
Print(3.14); // 컴파일러가 <double>로 타입 추론
Print("Hello World"); // <const char*> 타입으로 추론
template<typename T1, typename T2>
void Print(T1 a, T2 b)
{
std::cout << a << " " << b << std::endl;
}
구조:
T1과 T2라는 두 개의 타입 파라미터를 사용하여 서로 다른 데이터 타입을 처리합니다.사용 예시:
Print(10, "Hello"); // T1 = int, T2 = const char*
Print(3.14, 42); // T1 = double, T2 = int
template<>
void Print<int>(int a)
{
std::cout << "특수화된 정수 출력: " << a << std::endl;
}
설명:
int 타입에 대해서는 "특수화된 정수 출력"이라는 고유 메시지가 출력됩니다.사용 예시:
Print(10); // "특수화된 정수 출력: 10"
Print(3.14); // 일반 템플릿 호출
template<typename T>
class Stack
{
private:
T elements[100]; // 데이터 타입 T로 구성된 배열
int top;
public:
void push(T element)
{
elements[top++] = element;
}
T pop()
{
return elements[--top];
}
};
구조:
template<typename T>: 클래스 템플릿 선언.T는 멤버 변수와 멤버 함수의 데이터 타입을 일반화합니다.push 함수와 pop 함수는 T 타입의 데이터를 처리합니다.사용 예시:
Stack<int> intStack; // 정수형 스택
intStack.push(10);
std::cout << intStack.pop() << std::endl; // 출력: 10
Stack<std::string> strStack; // 문자열형 스택
strStack.push("Hello");
std::cout << strStack.pop() << std::endl; // 출력: Hello
template<typename T1, typename T2>
class Pair
{
private:
T1 first;
T2 second;
public:
Pair(T1 a, T2 b) : first(a), second(b) {}
void Print()
{
std::cout << first << ", " << second << std::endl;
}
};
구조:
T1과 T2라는 두 개의 타입 파라미터를 사용하여 두 가지 다른 데이터 타입을 처리합니다.Pair 클래스는 두 개의 데이터를 저장하고 출력하는 역할을 합니다.사용 예시:
Pair<int, std::string> p1(1, "Apple");
p1.Print(); // 출력: 1, Apple
template<>
class Stack<bool>
{
private:
unsigned char bitArray[100]; // 비트를 사용하여 bool 값을 압축 저장
int top;
public:
void push(bool value)
{
// 특수화된 push 구현
}
bool pop()
{
// 특수화된 pop 구현
}
};
bool 타입에 대해 클래스 템플릿을 특수화하여 메모리를 최적화한 구현을 제공합니다.bool 값은 각 비트로 저장되므로 메모리 사용량을 대폭 줄일 수 있습니다.template<typename T = int>
class RandomBox
{
private:
T data[100];
public:
T GetRandomData()
{
int index = rand() % 100;
return data[index];
}
};
설명:
T = int: 타입 파라미터 T의 기본값을 int로 설정.T를 지정하지 않으면 int로 간주됩니다.사용 예시:
RandomBox<> rb; // T가 int로 설정
RandomBox<float> rbFloat; // T를 float로 설정
void Print(int a)
{
std::cout << "일반 함수: " << a << std::endl;
}
template<typename T>
void Print(T a)
{
std::cout << "템플릿 함수: " << a << std::endl;
}
사용 예시:
Print(10); // 일반 함수 호출
Print(3.14); // 템플릿 함수 호출
설명:
헤더 파일에서 정의:
컴파일 오류:
템플릿 특수화의 활용: