뚜둔뚜둔✩

판다의 개발일지

C · C++

[C++] 템플릿(Template) 함수

2022. 7. 27. 00:36

C++에서는 함수의 오버로딩이 가능하다.

 

[C++] 함수 오버로딩(Overloading)

C언어와 달리 C++에서는 함수의 인자(parameter) 타입이나 개수가 다르면 동일한 이름의 함수를 여러 개 만들 수 있다. 이를 함수 오버로딩이라 한다. int func(int param1); int func(char param1); int func(int..

pandas-are-bears.tistory.com

C 언어에 비해선 편리해졌지만.. 여전히 나름의 불편함은 있다. 그 불편함은 바로 동일한 형태의 함수를 타입만 바꿔가며 일일이 다 작성해야 한다는 것이다. (오버로딩은 결국 동일 함수 이름의 사용만을 허용하는 것이기 때문)

 

여기서 유용한 것이 바로 C++의 템플릿이다.

 

템플릿은 말 그대로 일종의 "틀"을 제공해 사용자가 직접 동일 형태의 함수를 여러 개 작성하지 않아도 된다.

 

[ 함수 오버로딩만 사용 ]

int add(int param1, int param2)
{
    return param1 + param2;
}

double add(double param1, double param2)
{
    return param1 + param2;
}

long long add(long long param1, long long param2)
{
    return param1 + param2;
}

[ 템플릿 사용 ]

template<typename T>
T add(T param1, T param2)
{
    return param1 + param2;
}

 

위에서 볼 수 있듯이, 3개의 함수를 하나의 템플릿으로 코드 작성을 끝낼 수 있다. T는 특정 타입을 대표하며, add 함수 호출 때 T의 타입은 1) 사용자가 명시한 타입이거나, 타입 명시가 생략되었을 때에는 2) 컴파일러가 인자의 타입을 추론하여 결정하게 된다. 사용자는 <'type'> 형태로 타입을 명시할 수 있다.

add<int>(3, 4);         // T ==> int
add(3, 4);              // T ==> int
add<long long>(3, 4);   // T ==> long long

add(3, 4); 호출 때에는 사용자가 타입을 명시하지 않았기 때문에 컴파일러가 타입을 추론하여 int 타입을 사용하게 되는데, 만약 컴파일러가 T를 추론할 수 없을 때에는 컴파일 오류가 발생한다.

 

template<typename T>
T add(int param1, int param2)
{
    return param1 + param2;
}

int main(void)
{
    add(3, 4);
}
main.cpp:9:2: error: no matching function for call to 'add'
        add(3, 4);
        ^~~
main.cpp:2:3: note: candidate template ignored: couldn't infer template argument 'T'
T add(int param1, int param2)
  ^
1 error generated.

위 코드의 템플릿은 매개변수가 int 타입으로 정해져 있기 때문에 add(3, 4); 호출로는 T 타입을 추론할 수 없다.

 


 

[C++] 템플릿 함수 오버로딩 (Template Function Overloading)

C++에서는 함수 오버로딩 기능을 더더욱 유용하게 사용할 수 있도록 템플릿 기능을 제공한다. 하지만 템플릿을 사용하게 되면 동일 형태의 함수는 모두 동일한 동작을 수행하게 된다. 만약 특정

pandas-are-bears.tistory.com