C++ 함수 템플릿 특수화

Seongcheol Jeon·2024년 11월 15일
0

CPP

목록 보기
15/47
post-thumbnail

함수 템플릿 특수화

함수 템플릿은 여러 가지 데이터 형식을 처리하는 방법이지만, 특정 데이터 형식만 다른 알고리즘으로 처리하게 만들 수도 있다. 이처럼 특수한 상황일 때만 별도의 함수 템플릿으로 만들어 처리하는 방법을 템플릿 특수화 (template specialization) 라고 한다.

템플릿 특수화는 모든 템플릿 매개변수를 특정 데이터 형식으로 지정하는 명시적 특수화(explicit specialization)와 일부 템플릿 매개변수만 특정 데이터이 형식으로 지정하는 부분 특수화(partial specialization)가 있다.

함수 템플릿에서는 명시적 특수화만 사용할 수 있다.

함수 템플릿의 명시적 특수화는 템플릿 매개변수를 사용하지 않고 함수에 데이터 형식을 모두 지정하는 방법이다. 이때 함수 이름과 매개변수 개수는 변경하지 않는다. 이러한 구조는 멤버 함수의 오버라이딩(overriding)과 비슷한 개념이다.

data_sum 함수에 실수를 넘길 때, 정수로 변환한 후 계산하는 코드 예를 살펴보자.

#include <iostream>
#include <string>


using namespace std;


template <typename T>
T data_sum(T op1, T op2) {
    return op1 + op2;
}


template<>
double data_sum<double>(double op1, double op2) {
    return static_cast<int>(op1) + static_cast<int>(op2);
}


int main()
{
    int data1 = 3, data2 = 5;
    double data3 = 3.5, data4 = 5.5;
    string data5 = "Hello, ", data6 = "World!";

    cout << "int: " << data_sum<int>(data1, data2) << endl;
    cout << "double: " << data_sum<double>(data3, data4) << endl;
    cout << "string: " << data_sum<string>(data5, data6) << endl;

    return 0;
}

실행 결과는 다음과 같다. 결과를 보면 실수 3.5와 5.5가 각각 정수 3, 5로 변환되어 덧셈 결과 8이 출력된다.

int: 8
double: 8
string: Hello, World!

이처럼 템플릿 특수화는 특별한 데이터 형식만 별도로 처리할 때 사용할 수 있다.


템플릿 특수화를 사용하지 않고 함수를 따로 만들면 되지 않을까?

템플릿 특수화를 사용할지, 별도의 함수로 만들지는 개발자의 몫이다. 그러나 템플릿을 사용하는 소스 코드에서 특정 데이터만 다르게 처리해야 할 때는 템플릿 특수화를 이용하는 편이 좋다.

템플릿 특수화는 목적이 같은 알고리즘을 처리 방법만 다르게 표현하는 방법이므로 맥락은 같다. 이처럼 목적이 같은 코드를 같은 맥락으로 일관되게 작성하면 가독성을 높이는 데 도움이 된다.

0개의 댓글