C++ 템플릿 - 특수화

진경천·2023년 10월 30일
0

C++

목록 보기
69/90

명시적 특수화

명시적 특수화를 제공하여, 해당 타입에 대해 특별한 동작을 정의할 수 있게 해준다.
컴파일러는 호출된 함수에 정확히 대응하는 특수화된 정의를 발견하면, 더는
템플릿을 찾지 않고 해당 정의를 사용한다.

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

profile
어중이떠중이

0개의 댓글