Varyadik şablon bağlamında, üç nokta ...
, bir ifadenin sağ tarafında görünüyorsa ( bir an için bu ifade desenini çağırın) şablon parametre paketini açmak için kullanılır veya bu, paketin sol tarafında görünüyorsa bir paket argümanıdır . isim:
...thing
thing...
Kural, sol tarafındaki desen ne olursa olsun ...
tekrarlanır - paketlenmemiş desenler ( şimdi ifadeler olarak adlandırılır ) virgülle ayrılır ,
.
En iyi bazı örneklerle anlaşılabilir. Şu işlev şablonuna sahip olduğunuzu varsayalım:
template<typename ...T>
void f(T ... args)
{
g( args... );
h( x(args)... );
m( y(args...) );
n( z<T>(args)... );
}
Şimdi, bu işlevi geçiş T
olarak {int, char, short}
çağırırsam, işlev çağrılarının her biri şu şekilde genişletilir:
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) );
Gönderdiğiniz kodda, işlev çağrısı ile std::forward
gösterilen dördüncü modeli izler n()
.
Yukarıdaki x(args)...
ve arasındaki farka dikkat y(args...)
edin!
...
Bir diziyi başlatmak için şu şekilde de kullanabilirsiniz :
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...};
buna genişletilen:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
public
Aşağıdaki örnekte gösterildiği gibi bir modelin erişim belirtecini bile içerebileceğini yeni fark ettim :
template<typename ... Mixins>
struct mixture : public Mixins ...
{
};
Bu örnekte, desen şu şekilde genişletilmiştir:
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
Yani, tüm temel sınıflardan halka açık olarak mixture
türetilir .
Umarım yardımcı olur.
...
, tanıtıcı tanıtılmadan önce gelir. Paket türlerinden birini veya her ikisini kullanırken,...
genişletmek için ifade modelinden sonra gelir.