2 min read

C++ Template Template parameters

제목을 보면 알다시피 C++에서의 template 이 아닌 template 이란 단어가 하나 더 붙었다.

이 template template 이란 말그대로 template 안에 또 template 이 있다는 의미이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <algorithm>
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
template <typename T, template <typename Elem> class Cont = std::deque>
class Stack
{
public:
    bool empty() const
    {
        return elems.empty();
    }
private:
    Cont<T> elems;
};
int main() {
    Stack<intstd::vector> a;
    std::cout<<“asdas”;
}
cs

template <typename T, template <typename Elem> class Cont  =std::deque>이라는 이상한 문법을 볼수 있다.

아직 이문법은 아직 컴파일이 되지 않는데 그 이유는 추후에 설명하겠다.

이 문법을 안쓰게 되면 보통 template <typename T, class Cont = std::deque<T>>
위와 같이 작성할수 밖에 없다.

하지만 이는 Cont에 vector을 사용하게 되면 위해서 Stack<int, std::vector<int>> a; 이런식으로 작성할수 밖에 없다.

이를 해결하기 위해 template template 을 사용하는 것 이다.

위의 있는 코드가 컴파일이 안되는 이유는 STL의 특수한 속성을 만족못시켜서 발생한 거 때문이다.

Deque코드를 보게되면 _Alloc를 만족해야 한다. 그러므로 정상적인 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <algorithm>
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
template <typename T, template <typename Elem, typename Alloc = std::allocator<Elem>> class Cont = std::deque>
class Stack
{
public:
    bool empty() const
    {
        return elems.empty();
    }
private:
    Cont<T> elems;
};
int main() {
    Stack<intstd::vector> a;
}
cs