명시적 특수화를 제공하여, 해당 타입에 대해 특별한 동작을 정의할 수 있게 해준다.
컴파일러는 호출된 함수에 정확히 대응하는 특수화된 정의를 발견하면, 더는
템플릿을 찾지 않고 해당 정의를 사용한다.
template<>
함수이름<타입> (){
// 실행문
}
#include <iostream>
#include <vector>
using std::cout, std::endl;
class Test {
};
template<typename T>
void swap(T& x, T& y) {
cout << "swap" << endl;
T temp = x;
x = y;
y = temp;
}
template<>
void swap<Test>(Test& x, Test& y) {
cout << "swap<Test>" << endl;
}
int main() {
int a = 10;
int b = 20;
Test t0, t1;
swap(t0, t1);
swap(a, b);
}
swap<Test>
swap
template<typename T, typename S>
class Test {
public:
T num0;
S num1;
};
template<>
class Test<int, float> {
};
// 완전 특수화
template<typename T>
class Test<T, T> {
public:
T nums;
};
// 부분 특수화
template<typename T>
class Test<T, int> {
};
// 부분 특수화
int main() {
Test<float, float> t0;
Test<int, float> t1;
Test<float, int> t2;
t0.nums;
}
template<typename T>
class Queue {
private:
std::vector<T> _items;
public:
void push(T item) {
_items.push_back(item);
}
};
template<>
void Queue<int>::push(int item) {
cout << "int" << endl;
}
int main() {
Queue<float> q0;
q0.push(1.f);
Queue<int> q1;
q1.push(1);
}
int