개발자국/C/C++

C++ Template #1 : 템플릿 템플릿 인자

스펜서. 2012. 10. 25. 13:40

STL에는 메모리 할당을 받기 위해 단위전락 클래스를 인자로 받는다. 다들 vector라는 클래스를 쓸 때, vector<int>만 생각하지, 그 뒤에 어떤 템플릿 인자가 있는지 신경쓰지 않는다. 아래 그림에 보면 _Ty라는 인자 뒤에 _Ax라는 인자가 붙고, 이는 allocator<_Ty>가 기본 값이라는 것을 알 수 있다.


즉, vector<int>는 vector<int, allocator<int> >라는 의미이다.


그럼 이 allocator라는 클래스는 뭘까?에 대한 질문은 이번 포스팅 주제완 맞지 않아 다음에 다시 포스팅 하겠다.


간략히 이야기하자면, allocator는 메모리를 어떻게 할당 받겠는지에 대한 전략을 기술한 클래스이다. new로 할당을 받을지, malloc으로 할당을 받을지, 쓰레드마다 다른 힙에서 메모리를 할당 받을지 등의 메모리 할당 단위전략 클래스이다. 개발자는 allocator 정의에 맞춰서 메모리 할당 클래스를 만들면, 이를 vector가 메모리 할당을 할 때, 자신이 원하는 방법으로 메모리 할당을 받을 수 있게 한다.


예를 들어, vector가 메모리 할당을 받을 때, 내가 만든 메모리 풀을 이용하게 하고 싶으면, 메모리 풀에서 할당받는 형태의 allocator를 만들고, 이를 vector<int, MyMemoryPoolAllocator> 이렇게 선언하면 된다는 것이다.



그러나, allocator는 선언에 이미 자료형을 기술 하고 있기 때문에, 다른 자료형에 대해 할당하고자 한다면, allocator의 rebind를 사용해야 한다.

그림 2. rebind[1]

그러나, 저건 좀... 너무 길지 않나..? 범용 메모리 할당자를 만들되, allocator의 형태를 가지고 만들고 싶었다. 


인자가 없다고 나온다. 당연하지. allocator는 기본적으로 자료형을 입력받게 되어 있는데, 안줬으니까. 


그렇다고 위에 처럼 의미없는 자료형을 쓰고 싶진 않았다. 그러다가 Modern C++을 보다가 "템플릿 템플릿 인자"를 알았다.

템플릿 인자로써 들어가는 템플릿 클래스의 템플릿 인자를 템플릿화 한다는 의미이다.(써넣고도 무슨 말인지...)


마치 템플릿 함수에서 특정 자료형을 템플릿 인자로 해놓으면, 어떤 자료형이든지 들어오듯, 템플릿 인자에도 템플릿 키워드를 사용하여 바꾼다는 것이다. 더 설명이 안되므로 그냥 소스를 넣겠다.


보면 MyAllocator 위의 템플릿 선언이 복잡해 진것을 알 수 있다. 그 대신 위에서 발생한 문제가 나지 않는다.

위의 코드를 풀어 쓴다면,

_Ax에 템플릿 인자가 들어갈껀데, 나도 아직 몰라, 근데 하나 있어. 나중에 사용할 때 선언해줄께.
기달려. 지금은 곤란해.

이거다. 


[1] allocator::rebind, MSDN, Microsoft, http://msdn.microsoft.com/en-us/library/5fk3e8ek%28v=vs.80%29.aspx

[2] Mordern C++ Design, Andre Alexandrescu, 2005, 1.5.1 템플릿 템플릿 인자를 통한 단위전략 클래스의 구현, 42p