Dalam konteks template variadic, elipsis ...
digunakan untuk membongkar paket parameter template jika muncul di sisi kanan ekspresi (panggil pola ekspresi ini sebentar). Aturannya adalah bahwa pola apa pun yang ada di sisi kiri ...
akan diulang - pola yang tidak dikemas (sebut ekspresi sekarang) dipisahkan dengan koma ,
.
Ini dapat dipahami dengan baik dengan beberapa contoh. Misalkan Anda memiliki template fungsi ini:
template<typename ...T>
void f(T ... args)
{
g( args... ); //pattern = args
h( x(args)... ); //pattern = x(args)
m( y(args...) ); //pattern = args (as argument to y())
n( z<T>(args)... ); //pattern = z<T>(args)
}
Sekarang jika saya memanggil fungsi ini lewat T
sebagai {int, char, short}
, maka setiap pemanggilan fungsi diperluas sebagai:
g( arg0, arg1, arg2 );
h( x(arg0), x(arg1), x(arg2) );
m( y(arg0, arg1, arg2) );
n( z<int>(arg0), z<char>(arg1), z<short>(arg2) );
Dalam kode yang Anda posting, std::forward
ikuti pola keempat yang diilustrasikan oleh n()
pemanggilan fungsi.
Perhatikan perbedaan antara x(args)...
dan di y(args...)
atas!
Anda juga dapat menggunakan ...
untuk menginisialisasi array sebagai:
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
yang diperluas menjadi ini:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
Saya baru menyadari sebuah pola bahkan dapat menyertakan penentu akses seperti public
, seperti yang ditunjukkan pada contoh berikut:
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
Dalam contoh ini, polanya diperluas sebagai:
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
Artinya, mixture
diturunkan secara publik dari semua kelas dasar.
Semoga membantu.
...
muncul sebelum pengenal diperkenalkan. Saat menggunakan salah satu atau kedua jenis paket,...
muncul setelah pola ekspresi meluas.