타입에 의존하지 않고 하나의 값이 여러 다른 데이터 타입을 가질 수 있는 것.
프로그램의 알고리즘에 그 중점을 둔다.
template <typename or class 타입이름>
함수의 원형{
함수의 본체
}
type이 파라미터로 작용하여 템플릿이 type을 추론하여 바꿔준다
명시적으로 선언하기 위해선 함수 옆에 < > 안에 타입을 넣어준다
ex) swap<int>(x, y);
#include <iostream>
using std::cout, std::endl;
template<typename T>
void swap(T& x, T& y) {
x ^= y;
y ^= x;
x ^= y;
}
int main() {
int a = 10;
int b = 20;
char c = 'A';
char d = 'B';
swap(a, b);
cout << "a : " << a << endl;
cout << "b : " << b << endl;
swap(c, d);
cout << "c : " << c << endl;
cout << "d : " << d << endl;
}
a : 20
b : 10
c : B
d : A
#include <iostream>
using std::cout, std::endl;
template<int N, typename T>
int func(T (&num)[N]) {
return N;
}
int main() {
int nums[100] = { 1, 2, 3 };
char chars[30] = { 'a', 'b', 'c' };
cout << func(nums) << endl;
cout << func(chars) << endl;
}
100
30
T로 배열의 타입을 추론하고 N은 배열의 사이즈를 나타낸다.
명시적 특수화를 제공하여, 해당 타입에 대해 특별한 동작을 정의할 수 있게 해준다.
컴파일러는 호출된 함수에 정확히 대응하는 특수화된 정의를 발견하면, 더는 템플릿을 찾지 않고 해당 정의를 사용한다.
#include <iostream>
using std::cout, std::endl;
template<typename T>
void swap(T& x, T& y) {
T temp = x;
x = y;
y = temp;
}
template<> void swap<double>(double&, double&) {
// type이 double이면 아무것도 하지 않는다.
}
int main() {
double a = 1.2;
double b = 2.4;
swap<double>(a, b);
cout << "a : " << a << endl;
cout << "b : " << b << endl;
}
a : 1.2
b : 2.4