C++에서는 함수의 오버로딩이 가능하다.
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 · C++' 카테고리의 다른 글
[C++] 템플릿 함수 오버로딩 (Template Function Overloading) (0) | 2023.07.02 |
---|---|
[C++] 복사 생성자 (Copy Constructor) (0) | 2023.01.15 |
[C++] 함수 오버로딩(Overloading) (0) | 2022.07.23 |
[C++] Default Arguments (Parameters) (0) | 2022.07.16 |
[C++] 함수의 선언과 구현부 분리 (0) | 2022.07.13 |