2012-11-21 3 views
0

다음은 다양한 가변 형식이 아닌 중첩 클래스 템플릿 DEF을 정의합니다. 형식이 아닌 템플릿 매개 변수는 Ts에 제공된 형식 인수에 따라 이기종 일 수 있습니다. 다음과 같이이기종 가변 형식이 아닌 템플릿 인수 개수가 유연합니까?

template <typename ...Ts> 
struct ABC { 
    template <Ts ...Xs> 
    struct DEF {}; 
}; 

DEF 객체를 선언 할 수 있습니다 :

ABC<int,bool>::DEF<17,true> x; 

내 질문 DEF 제공 비 형 템플릿 인수의 수를 제공 형 템플릿 인수의 수보다 작을 수있다 ABC? Ts...이 팩 팽창하기 때문에,

ABC<int,bool>::DEF<17> y; 
ABC<int,bool>::DEF< > z; 

답변

2

번호 : 예를 들어, 유효이 선언 중 하나입니다. 팩 확장가리스트에 패턴의 0 개 이상의 인스턴스 생성을 생산 인스턴스화되는의 패턴 및 생략 기호로 구성

§14.5.3 [temp.variadic]

P4는 (후술). 패턴의 형식은 확장이 발생하는 컨텍스트에 따라 다릅니다. 팩 확장은 다음과 같은 상황에서 일어날 수

  • [...] 팩 확장 (14.1) 인 템플릿 파라미터 팩
  • :
    • 템플릿 파라미터 팩은 파라미터이면 - 선언; 패턴은 매개 변수 선언이며 줄임표가 없습니다.
    • [...] 팩 팽창

P6 인스턴스화 [...]은리스트를 E 1, E 2, ..., N E 생산 여기서 N은 팩 확장 매개 변수의 요소 수입니다. [...]

DEF은 정확히 <int, bool> 이니 두 가지 예는 부적절합니다.

+0

고맙습니다. 이것이 이것이'Xs '이름의 성질에 어떻게 영향을 주는지 궁금합니다. 당신의 답에서 암시가 * last * 유형에만 이름을 지정하는 것이 아니겠습니까? Clang과 GCC에서 위의 예제에서'Xs ... '를 사용하면'make_tuple (Xs ...)'를 통해'tuple (17, true) '를 채울 수 있습니다. – user2023370

+1

@user :'Ts ... '가 팩 확장이라고해서'Xs'가 매개 변수 팩이 아니라는 것을 의미하지는 않습니다. :) – Xeo

관련 문제