1.
gun(A<Ts...>::hun(vs)...)
=> gun(A<T1, T2, …, Tn>::hun(vs)...)
=> gun(A<T1, T2, …, Tn>::hun(v1),
A<T1, T2, …, Tn>::hun(v2),
…,
A<T1, T2, …, Tn>::hun(vm))
2.
gun(A<Ts...>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(vs...))
=> gun(A<T1, T2, …, Tn>::hun(v1, v2, …, vm))
này nên được rõ ràng.
3.
gun(A<Ts>::hun(vs)...)
=> gun(A<T1>::hun(v1), A<T2>::hun(v2), …, A<Tn>::hun(vn))
(Trong trường hợp này chương trình sẽ không biên dịch nếu độ dài của Ts và vs khác nhau)
Các ...
sẽ mở rộng một mô hình (trong đó bao gồm các gói thông số) preceeding it, có nghĩa là. Trong foo(Ts, Us, Vs)...
, mỗi thành viên trong danh sách Ts
, Us
, Vs
(được liệt kê trong bước khóa) sẽ được subsituted vào mô hình đó, và một danh sách dấu phẩy được hình thành:
foo(Ts, Us, Vs)...
=> foo(T1, U1, V1), foo(T2, U2, V2), …, foo(Tn, Un, Vn)
Và nếu có được lồng mở rộng, các mô hình trong cùng sẽ được mở rộng trước. Do đó, trong trường hợp 1, mẫu Ts
trước tiên sẽ được mở rộng thành T1, T2, …, Tn
. Và sau đó, mẫu phía trước bên ngoài ...
là A<T1, T2, …, Tn>::fun(vs)
- lưu ý rằng Ts
đã được mở rộng - vì vậy nó sẽ được mở rộng thành A<T1, T2, …, Tn>::fun(v1), <T1, T2, …, Tn>::fun(v2), …, <T1, T2, …, Tn>::fun(vm)
bằng cách thay thế v1
, v2
, v.v. thành vs
.
Bạn có thể muốn chỉ định 'Ts' là (ví dụ)' void *, int, char, std :: string' hoặc một cái gì đó, vì vậy các câu trả lời sắp xếp tốt hơn một chút. –