템플릿 템플릿 매개 변수에 대한 정보...

cleol의 이미지

template <class T>
struct Class {
	typedef T Type;
}
 
template <class C>
void func(C t) {
	C::Type x ~~
}
 
...
 
Class<int> c;
func(c);
 
...

위처럼 typedef 를 사용해서 템플릿 인자로 전달된 타입에 대한 정보를 사용할 수 있습니다.

그런데, 아래 같은 경우에는...

template <template <class> class T>
struct Class {
	typedef T Type; // 불가능. T 는 타입 이름이 아니라 템플릿 이름이므로.
}
 
template <class C>
void func(C t) {
	C::Type<int> x ~~ // 이런 식으로 사용할 수 있다면 좋을텐데요...
}
 
...
 
template <class C>
class X ...
 
Class<X> c;
func(c);
 
...

어떤 방법이 있을까요?

klara의 이미지

template <class <class> T> 이건 무엇인가요? 뭘 의도하신건지 전혀 모르겠습니다.

cleol의 이미지

template template parameter 라고 불립니다.
템플릿 인자가 타입이 아니라 템플릿인 거지요.
위 구문은 "템플릿 인자가 하나인 템플릿"을 인자로 받는 템플릿을 선언하는 구문입니다.

klara의 이미지

불가능이란 부분을 제외하고 컴파일 해보긴 하셨나요?
template template parameter라면 template <class <class> T>가 아니라
template <template <class> class T> 이겠지요.

cleol의 이미지

맞습니다. 코드 전체를 올릴 수 없어서 적당히 개념만 맞도록 만들어 써넣다가 생긴 오타입니다.
&lt;, &gt; 를 치기 귀찮아서 이리 저리 복사해 넣다가 잘못된 모양이네요.
본문 수정했습니다.

cleol의 이미지

방법이 없는 것 같아 포기하고 있다가 문득 생각나서 시간을 들여서 검색을 좀 해봤습니다.
많은 사람들이 비슷한 것을 원하고 있는 것 같더군요.
Herb Sutter 가 이미 오래전에 "typedef template" 이라는 이름으로 제안을 했고,
(http://www.ddj.com/cpp/184403850)
C++0x 에 "template alias" 라는 이름으로 들어가 있군요.
(http://www.ddj.com/cpp/184403850)
g++ 이 C++0x 의 일부 기능을 시험적으로 지원한다고 알고 있어서 혹시나하고 찾아봤더니,
불행히도 아직 g++ 에서는 지원되지 않습니다. 이런...-_-
(http://gcc.gnu.org/gcc-4.4/cxx0x_status.html)

cleol의 이미지


그리고 많이 알려진 workaround 가 있군요.
본문에서 의도했던 바는
다음과 같이 구현할 수 있습니다.

template &lt;template &lt;class&gt; class T&gt;
struct Class {
	template &lt;class S&gt;
	struct Inner {
		typedef T&lt;S&gt; Type;
	}
}
 
template &lt;class C&gt;
void func(C t) {
	C::Inner&lt;int&gt;::Type x;
}
 
...
 
template &lt;class C&gt;
class X ...
 
Class&lt;X&gt; c;
func(c);
winner의 이미지

그런데 C::Inner::Type x; 는 typename C::Inner::Type 을 쓰는 것이 표준에 맞을 겁니다.
제 기억으로는 Visual C++ 에서는 compile이 되어도 g++에서는 안 될텐데 말이예요.