계속 my journey into the world of variadic templates, 다른 문제가 발생했습니다. foo<int>
는 기본 구현 및 foo< std::tuple< int, char > >
에 해당되며,이와여러 템플릿 매개 변수 팩을 사용하여 부분 템플릿 전문화
template < template < typename ... > class T, typename ...Args >
struct foo< T<Args...> >
{
//specialized implementation
};
:
template < typename T >
struct foo
{
//default implementation
};
이 부분적으로 가변 인자 템플릿이 같은 인스턴스 생성을 위해 전문 수 있습니다 :
다음 템플릿 클래스를 가정 전문화 된 구현으로
그러나 여러 가지 템플릿 매개 변수를 사용하면 상황이 더욱 복잡해집니다. 우리는 다음과 같은 템플릿 클래스
template < typename T, typename U >
struct bar {};
을 가지고 있고 우리는 우리가 foo
위해했던 것처럼 부분적으로 전문하려는 경우 예를 들어, 우리는 내가 올바른 오전, 우리는 할 수있다, 실제로
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> > {};
//This would correspond to the specialized version with
//T=std::tuple,
//TArgs=int,char
//U=std::tuple,
//UArgs=float
bar< std::tuple< int, char >, std::tuple<float> > b;
할 수 없습니다 하나의 템플리트 매개 변수 팩을 가지며 매개 변수 목록의 끝에 위치해야합니다. 나는 이것이 템플릿 선언에서 필수적인 이유를 이해하지만 위의 예제와 같은 특정 부분 템플릿 전문화에 대해서는 이것이 문제가되지 않아야한다.
여러 템플릿 매개 변수 팩을 사용하여 부분 템플릿 전문화를 수행 할 수 있습니까?
편집이 : 지금은 바보 느낌 ... 내가 위에서 준 코드는 (적어도 GCC 4.5) 완벽하게 컴파일합니다. 내가 가진 컴파일 오류는 다중 매개 변수 팩 때문이 아니라 멤버 함수 매개 변수로 사용되기 때문입니다. bar
의 부분 특수화에서, I는 모두 TArgs
및 UArgs
파라미터 얻어 멤버 함수를 정의하려고 : 멤버 함수 선언에서
template < template < typename ... > class T, typename ...TArgs,
template < typename ... > class U, typename ...UArgs >
struct bar< T<TArgs...>, U<UArgs...> >
{
void method(TArgs... targs, UArgs... uargs) //compile error here
{
}
};
를 GCC 내게 오류
제공파라미터 팩 있어야 매개 변수 목록 끝에.
내가 알 수있는 한 컴파일러는 주어진 템플릿 인스턴스화에 대한 올바른 멤버 함수를 정의 할 수 있어야합니다. bar< std::tuple< int, char >, std::tuple<float> >
에는 멤버 함수 void method(int, char, float)
이 포함되어야합니다. 내가 뭔가 잘못하고 있는거야? 아니면 불가능한 일을하려고합니까? 그렇다면 이것이 불가능한 이유가 있습니까?
깔끔하고, 템플릿 목록의 요소를 템플릿 자체로 지정하거나 지정할 수 있다는 것을 알지 못했습니다. – JAB