프로그래밍/C/C++

C++ template with member function

nanze 2022. 1. 13. 22:34
반응형

이번 포스팅은 클래스의 멤버 함수(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;
}

갑자기 생각난 김에 다음에 시간나면 스마트 포인터에 대해서도 정리해야 겠다.

반응형