2013-08-05 9 views
2

템플릿을 매개 변수 유형에 부분적으로 바인딩하는 방법이 있습니까? 예를 들어, 나는 다음과 같은 템플릿이 있습니다부분 템플릿 바인딩, 형식으로 새 템플릿을 만듭니다.

template<typename T, typename Q> struct generic { }; 

을 그리고 나는 첫 번째 유형으로의 인스턴스를 만들 수 있기를 기대하고, 매개 변수로 템플릿 클래스 소요 다른 템플릿이 있습니다

template<typename T, template<typename> class Impl> 
struct wrapper { 
    Impl<T> foo; 
}; 

변경하지 않고 template<typename T>과 같은 간단한 템플릿을 사용할 수 있습니다. 이제는 만을 지정하고 wrapper에 전달하여 generic 템플릿을 부분적으로 바인딩하고 싶습니다. 이 같은 몇 가지 구문을 만드는, 아마도 뭔가 :

template<typename T> bound : public generic<T,some_type> { }; 

나는 그것이 생성자에 문제가 발생로하지만이를 방지 할 수 있지만 바라고 :

template<typename T> bound = generic<T,some_type>; 

나는 거의 내가 상속을 사용하여 원하는 것을 얻을 수있어 그리고 기본 클래스에서 정의 된 연산자. C++ 11에서

+1

' 템플릿을 사용하면 bound = generic ; 일명 "template-typedef"? –

+0

@BartekBanachewicz, 잘 생겼어 ... 아직 지원하지 않는 GCC 4.6부터 테스트 할 수는 없다. 아마도이 작업을 수행하는 이전 기능이 없다는 뜻입니다. –

+0

이 기능은 * Template Aliases *로도 알려져 있으며 [이 차트] (http://gcc.gnu.org/projects/cxx0x.html)에 따르면 '4.7' 이후 실제로 지원됩니다. –

답변

4

당신이

template<class X> 
struct Bind_CPP03 
{ 
    typedef generic<X, Y> type; 
}; 

template<class X, template<class> class Impl> 
struct wrapper_CPP03 
{ 
    typename Impl<X>::type foo; 
// ^^^^^^^^ to extract dependent type 
}; 
C++ 98/03, 당신이 사용할 수있는 간단한 class composition (여기 내가 사용하지 않을 상속)에서 템플릿 별칭

template<class X> 
using Bind_CPP11 = generic<X, Y>; 

template<class X, template<class> class Impl> 
struct wrapper_CPP11 
{ 
    Impl<X> foo; 
}; 

을 사용할 수 있습니다

Live Example.

+0

컴포지션은 'wrapper'가 타입을 어떻게 참조 하는지를 바꿀 것을 요구합니다. 내 경우에는 그렇게 할 수 있을지 잘 모르겠지만 대답은 여전히 ​​괜찮습니다. –

+0

@ edA-qamort-ora-y 예, C++ 11로 업그레이드하면 'wrapper'를 수정하는 것이 TODO가됩니다 – TemplateRex