Phần sau được trích từ bài nói chuyện "Các mẫu đa dạng là Funadic" của Andrei Alexandrescu tại GoingNative 2012. Tôi có thể giới thiệu nó để có một phần giới thiệu tốt về các mẫu đa dạng.
Có hai điều người ta có thể làm với một gói đa dạng. Có thể áp dụng sizeof...(vs)
để lấy số lượng phần tử và mở rộng nó.
Quy tắc mở rộng
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)
Mở rộng tiến hành từ trong ra ngoài. Khi mở rộng hai danh sách trong bước khóa, chúng phải có cùng kích thước.
Các ví dụ khác:
gun(A<Ts...>::hun(vs)...);
Mở rộng tất cả Ts
trong danh sách đối số mẫu A
và sau đó hàm hun
được mở rộng với tất cả vs
.
gun(A<Ts...>::hun(vs...));
Mở rộng tất cả Ts
trong danh sách đối số mẫu A
và tất cả vs
dưới dạng đối số hàm cho hun
.
gun(A<Ts>::hun(vs)...);
Mở rộng chức năng hun
với Ts
và vs
trong bước khóa.
Ghi chú:
Ts
không phải là một loại và vs
không phải là một giá trị! Chúng là bí danh cho danh sách các loại / giá trị. Một trong hai danh sách có thể trống. Cả hai chỉ tuân theo những hành động cụ thể. Vì vậy, những điều sau đây là không thể:
typedef Ts MyList; // error!
Ts var; // error!
auto copy = vs; // error!
Loci mở rộng
Đối số hàm
template <typename... Ts>
void fun(Ts... vs)
Danh sách trình khởi tạo
any a[] = { vs... };
Thông số cơ sở
template <typename... Ts>
struct C : Ts... {};
template <typename... Ts>
struct D : Box<Ts>... { /**/ };
Danh sách trình khởi tạo thành viên
// Inside struct D
template <typename... Us>
D(Us... vs) : Box<Ts>(vs)... {}
Danh sách đối số tạm thời
std::map<Ts...> m;
Sẽ chỉ biên dịch nếu có thể phù hợp với các đối số.
Chụp danh sách
template <class... Ts> void fun(Ts... vs) {
auto g = [&vs...] { return gun(vs...); }
g();
}
Danh sách thuộc tính
struct [[ Ts... ]] IAmFromTheFuture {};
Nó nằm trong đặc điểm kỹ thuật, nhưng vẫn chưa có thuộc tính nào có thể được thể hiện dưới dạng một kiểu.
...
xuất hiện trước khi số nhận dạng được đưa vào. Khi sử dụng một trong hai hoặc cả hai loại gói, phần...
mở rộng đứng sau mẫu biểu thức.