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<int, std::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<int, std::vector> a;
}
|
cs |