템플릿 템플릿 매개 변수에 대한 정보...
글쓴이: cleol / 작성시간: 일, 2009/04/12 - 10:47오후
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); ...
어떤 방법이 있을까요?
Forums:
template <class <class> T>
template <class <class> T> 이건 무엇인가요? 뭘 의도하신건지 전혀 모르겠습니다.
template template parameter
template template parameter 라고 불립니다.
템플릿 인자가 타입이 아니라 템플릿인 거지요.
위 구문은 "템플릿 인자가 하나인 템플릿"을 인자로 받는 템플릿을 선언하는 구문입니다.
불가능이란 부분을
불가능이란 부분을 제외하고 컴파일 해보긴 하셨나요?
template template parameter라면 template <class <class> T>가 아니라
template <template <class> class T> 이겠지요.
맞습니다. 코드
맞습니다. 코드 전체를 올릴 수 없어서 적당히 개념만 맞도록 만들어 써넣다가 생긴 오타입니다.
<, > 를 치기 귀찮아서 이리 저리 복사해 넣다가 잘못된 모양이네요.
본문 수정했습니다.
방법이 없는 것 같아
방법이 없는 것 같아 포기하고 있다가 문득 생각나서 시간을 들여서 검색을 좀 해봤습니다.
많은 사람들이 비슷한 것을 원하고 있는 것 같더군요.
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)
그리고 많이 알려진
그리고 많이 알려진 workaround 가 있군요.
본문에서 의도했던 바는
다음과 같이 구현할 수 있습니다.
그렇게 쓰는 것이 만족이라면 그걸로 충분하긴 한데...
그런데 C::Inner::Type x; 는 typename C::Inner::Type 을 쓰는 것이 표준에 맞을 겁니다.
제 기억으로는 Visual C++ 에서는 compile이 되어도 g++에서는 안 될텐데 말이예요.
댓글 달기