c++에서 template은 어떻게 인스턴스화 되는지 확인해봅니다. 

template<typename T>
class Stack
{
public:
    void push(T const & val){ m_Container.push_back(val); }
    void pop(){ m_Container.pop_back(); }
    T top() const{ return m_Container.back(); }
private:
	std::vector<T> m_Container;
};

컴파일러는 위와 같은 템플릿 클래스를 만나게 되면 우선 문법상에 문제가 없는지 확인합니다. 

예를 들어서 ;이 빠졌다던지 {, }의 위치가 잘못되었다던지 이런 문법적인 것들만 검사합니다. 

그런 후 아무 문제가 없으면 그냥 지나갑니다. 

 

이제 실제로 template의 객체가 호출되는 시점에 해당 타입에 대한 인스턴스가 유효 한지 확인합니다.

int main()
{
    Stack<int> iStack; // 1. Stack<int> 인스턴스 생성
    iStack.push(1);
    iStack.push(2);
    std::cout << iStack.top() << std::endl;
    
    Stack<std::string> strStack; // 2. Stack<string> 인스턴스 생성
    
    
    return 0;
}

main() 함수 1 Line에서 Stack <int>라는 객체를 호출하는 시점에 컴파일러는 내부적으로 아래와 같은

클래스를 생성하고 검사합니다. 

// template Stack<int>에 대한 템플릿 클래스 코드
class Stack
{
public:
	void push(int const & val) { m_Container.push_back(val); }
	void pop() { m_Container.pop_back(); }
	int top() const { return m_Container.back(); }
private:
	std::vector<int> m_Container;
};

main()함수 6 Line에서 Stack <string>을 만나면 다시 새로운 타입에 대한 인스턴스가 유효 한지 확인합니다

// template Stack<string>에 대한 템플릿 클래스 코드
class Stack
{
public:
	void push(string const & val) { m_Container.push_back(val); };
	void pop() { m_Container.pop_back(); };
	string top() const { return m_Container.back(); };
private:
	std::vector<string> m_Container;
};

이와 같이 템플릿은 컴파일이 정의에서 한 번, 실제 인스턴스화 될 때 한 번 총 2번에 걸쳐서 컴파일이 진행됩니다.

템플릿은 템플릿 객체가 인스턴화되는시점에 유효성을 확인하기 위해서 템플릿의 대한 정의를 

컴파일러가 알아야 하기 때문에 정의와 구현부의 분리하기가 쉽지가 않습니다. 

그래서 이러한 문제를 해결하기 위해서 정의와 구현부를 함께 두는 hpp라는 파일로 구현하게 됩니다.

'c++ > template' 카테고리의 다른 글

[template] 함수 템플릿  (0) 2019.09.21

+ Recent posts