반응형
이번 포스팅은 클래스의 멤버 함수(member function)를 템플릿(template)과 사용할 때 그 문법과 작성법에 대해서 알아보자. 일단 일반적인 형태는 아래 예시와 같다.
#include <iostream>
using namespace std;
template <typename T>
class Vec
{
public:
void push(T a);
template <typename K>
T func(K a);
};
template <typename T>
void Vec<T>::push(T a)
{
}
template <typename T>
template <typename K>
T Vec<T>::func(K a)
{
}
int main()
{
return 0;
}
위와 같이 멤버 함수에 템플릿을 사용함으로써 얻는 이득은 무엇일까 ?
다음 코드를 보자.
#include <iostream>
template <typename T>
class Test
{
public:
Test(T a) { m_value = a; };
private:
T m_value;
};
int main()
{
Test<int> x(3);
Test<int> y = x;
Test<float> z = y;
return 0;
}
위 코드는 Test<float> 대입하는 부분에서 컴파일 에러가 난다. 당연하다. 타입이 다르기 때문에 될 수 없다. 위 코드를 아래와 같이 변경하면 다른 타입에 대해서도 대입하도록 만들 수 있다.
#include <iostream>
template <typename T>
class Test
{
public:
Test(T a) { m_value = a; };
template <typename K>
Test(const Test<K>& rhs);
template <typename K>
friend class Test;
private:
T m_value;
};
template <typename T>
template <typename K>
Test<T>::Test(const Test<K>& rhs) {
}
int main()
{
Test<int> x(3);
Test<int> y = x;
Test<float> z = y;
return 0;
}
위와 같이 수정함으로써 Test<float> 은 Test<int>를 복사할 수 있게 된다.
코드를 본바와 같이 복사 생성자와 템플릿을 조합한 것이다. 위와 같은 방식으로 하여 사용하는 것의 대표적인 예과 std::shared_ptr 이라고 들 수 있다.
다음 코드를 보자. shared_ptr 을 쓴 예이다.
class Animal {};
class Dog :public Animal {};
int main()
{
std::shared_ptr<Dog> x(new Dog);
std::shared_ptr<Animal> y = x;
return 0;
}
갑자기 생각난 김에 다음에 시간나면 스마트 포인터에 대해서도 정리해야 겠다.
반응형
'프로그래밍 > C/C++' 카테고리의 다른 글
[C++] explicit - 정보공유의 장 (0) | 2022.01.15 |
---|---|
[C++] 스마트포인터 shared_ptr - 정보공유의 장 (0) | 2022.01.15 |
C++ Template and Integral_constant (0) | 2022.01.12 |
C++ template 과 type 추론 (0) | 2022.01.11 |
C++ Perfect forwarding (std::forward 의 역할) (0) | 2022.01.08 |