Kurallar için " nelerdir;..." variadic şablon bağlamında token?
C 11 bunun gibi variadic şablonları vardır:
template< class T, class... Args >
unique_ptr<T> make_unique( Args&&... args )
{
return unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Bu konuda bazı ilginçlikler var: std::forward<Args>(args)... Args args hem kullandığı ifade, ama sadece bir tane ... token. Ayrıca std::forward non-variadic bir şablon işlevi tek bir şablon parametresi ve tek bir argüman alacak. Nedir bu sözdizimi kuralları (yaklaşık)? Nasıl genellenebilir?
Ayrıca: işlevi uygulamasında üç nokta (...) faiz ifadelerin sonunda. Şablon bağımsız değişken listesi ve parametre listesindeki üç nokta ortada bir sebep var mı?
CEVAP
Variadic şablon bağlamında, 14* *üç nokta görünür eğer şablon parametre paketini açmak için ifadenin sağ tarafında (bu ifadeyi arayın . kullanılır ^em>desenbir an için. Kural neyse odesen... sol tarafında tekrarlanır -; paketten kalıpları (onları arayınifadelerşimdi)* *16 virgül. ayrılır
Bazı örnekler ile en iyi anlaşılacaktır. Bu işlev şablon varsayalım:
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)
}
Şimdi bu fonksiyonu {int, char, short}, sonra işlev çağrısı her olarak genişletilir T pas diyorum:
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) );
, 21* *sana gönderilen kodu aşağıdaki dördüncü desen n() işlev çağrısı tarafından resimli.
x(args)... y(args...) arasındaki fark yukarıdaki not!
... bir dizi olarak başlatmak için kullanabilirsiniz:
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
bu ÅŸekilde geniÅŸletilmiÅŸ olan:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
Ben sadece bir desen aşağıdaki örnekte gösterildiği gibi public gibi türemiş olabilir bile fark etti:
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
Bu örnekte, desen olarak genişletilmiş
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
Yani, mixture türetiralenentüm temel sınıfları.
Bu yardımcı olur umarım.

Python3's "Fonksiyonu ek Açı...
's "yanlış" C wchar_t v...
Href JavaScript bağlantıları için özni...
Bir WordPress kullanmak için bir&; var...
Bir dize kontrol etmek için nasıl &quo...