C++ 템플릿 - 함수 템플릿

진경천·2023년 10월 30일
0

C++

목록 보기
67/90

일반화 프로그래밍 generic programming

타입에 의존하지 않고 하나의 값이 여러 다른 데이터 타입을 가질 수 있는 것.
프로그램의 알고리즘에 그 중점을 둔다.

템플릿

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

profile
어중이떠중이

0개의 댓글