728x90
함수 템플릿
오버로딩을 편하게 정의할 수 있도록 만들어주는 느낌?이다. 오버로딩과의 차이점은 타입만 다르고 동작은 동일한 것이다. 예를 들어
void Print(int value)
{
cout << value << endl;
}
void Print(float value)
{
cout << value << endl;
}
void Print(double value)
{
cout << value << endl;
}
void Print(const char* value)
{
cout << value << endl;
}
int main()
{
Print(1);
Print(2.f);
Print(3.0);
Print('4');
}
이렇게 다양한 방식으로 같은 이름의 함수들이 존재할 때 유용하고 아래와 같이 사용하면 된다.
template<class T> // template<typename T> 도 가능!
void Print(T value)
{
cout << value << endl;
}
int main()
{
Print(1);
Print(2.f);
Print(3.0);
Print('4');
}
또한 2개 이상의 타입을 받을 때도 가능하다.
template<class T>
void Print(T value)
{
cout << value << endl;
}
template<class T1, class T2>
void Print(T1 v1, T2 v2)
{
cout << v1 << " " << v2 << endl;
}
int main()
{
Print(1);
Print(2.f);
Print(3.0);
Print('4');
Print(1, 3.f);
}
템플릿은 컴파일 타임에 결정되어 컴파일러가 알아서 여러개의 함수로 작성해준다. 즉 Print(1);만 적어주면 int에 관한 Print함수를 만들어 줄 것이고, 그 외 다른 타입을 사용한다면 다른 함수들도 그 때 생겨나는데, 컴파일러가 추론할 수 있다면 타입을 명시하지 않아도 무방하지만 타입을 지정해서 사용도 가능하다.
int main()
{
Print<int>(1);
Print<float>(2.f);
Print<double>(3.0);
Print<char>('4');
Print<int, float>(1, 3.f);
}
템플릿 특수화
특정 클래스만 따로 실행되는 함수를 만들고 싶다면 템플릿 특수화를 이용하면된다. 예를 들어 Test클래스의 객체를 받는 Print함수를 만들고 싶다고 가정하고, Test 클래스의 객체를 넘겨 받으면 그 객체의 멤버 변수를 출력하는 함수를 만든다고 해보자. 그럼 아래와 같이 template<>에 아무것도 넣지 않고 작성하면 된다.
class Test
{
public:
int value = 100;
};
template<class T>
void Print(T value)
{
cout << value << endl;
}
template<>
void Print(Test t)
{
cout << t.value << endl;
}
int main()
{
Print<int>(1);
Print<float>(2.f);
Print<double>(3.0);
Print<char>('4');
Test t;
Print(t);
}
728x90
'C++ > C++ 기본' 카테고리의 다른 글
생성자 (Constructor) (1) | 2023.05.16 |
---|---|
함수 포인터 (0) | 2023.05.12 |
캐스팅 (0) | 2023.05.12 |
얕은 복사와 깊은 복사 (0) | 2023.05.12 |