다음은 GoingNative 2012에서 Andrei Alexandrescu의 "Variadic Templates are Funadic" 강연에서 발췌 한 것입니다. 가변 템플릿에 대한 좋은 소개를 위해 추천 할 수 있습니다.
가변 팩으로 할 수있는 일은 두 가지가 있습니다. sizeof...(vs)
요소 수를 가져와 확장하기 위해 신청할 수 있습니다.
확장 규칙
Use Expansion
Ts... T1, ..., Tn
Ts&&... T1&&, ..., Tn&&
x<Ts,Y>::z... x<T1,Y>::z, ..., x<Tn,Y>::z
x<Ts&,Us>... x<T1&,U1>, ..., x<Tn&,Un>
func(5,vs)... func(5,v1), ..., func(5,vn)
확장은 안쪽으로 바깥쪽으로 진행됩니다. 잠금 단계에서 두 목록을 확장 할 때는 크기가 같아야합니다.
더 많은 예 :
gun(A<Ts...>::hun(vs)...);
Ts
의 템플릿 인수 목록에서 모두 를 확장 A
한 다음 함수 hun
가 all으로 확장됩니다 vs
.
gun(A<Ts...>::hun(vs...));
Ts
의 템플릿 인수 목록에서 A
all 및 all vs
의 함수 인수로 모두 확장합니다 hun
.
gun(A<Ts>::hun(vs)...);
기능 확장 hun
과 Ts
과 vs
로크 단계.
노트 :
Ts
유형 vs
이 아니며 값이 아닙니다! 유형 / 값 목록의 별칭입니다. 두 목록 중 하나가 비어있을 수 있습니다. 둘 다 특정 행동에만 순종합니다. 따라서 다음은 불가능합니다.
typedef Ts MyList; // error!
Ts var; // error!
auto copy = vs; // error!
확장 궤적
함수 인수
template <typename... Ts>
void fun(Ts... vs)
이니셜 라이저 목록
any a[] = { vs... };
기본 지정자
template <typename... Ts>
struct C : Ts... {};
template <typename... Ts>
struct D : Box<Ts>... { /**/ };
멤버 이니셜 라이저 목록
// Inside struct D
template <typename... Us>
D(Us... vs) : Box<Ts>(vs)... {}
임시 인수 목록
std::map<Ts...> m;
인수와 일치 할 수있는 경우에만 컴파일됩니다.
목록 캡처
template <class... Ts> void fun(Ts... vs) {
auto g = [&vs...] { return gun(vs...); }
g();
}
속성 목록
struct [[ Ts... ]] IAmFromTheFuture {};
사양에 있지만 유형으로 표현할 수있는 속성은 아직 없습니다.
...
식별자가 도입되기 전에옵니다. 하나 또는 두 유형의 팩을 사용하는 경우...
확장 할 표현식 패턴 뒤에옵니다.