SORU
15 Temmuz 2013, PAZARTESİ


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
15 Temmuz 2013, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • amc

    amc

    21 EYLÜL 2005
  • Good Creative Academy

    Good Creativ

    19 Kasım 2009
  • Paste Magazine

    Paste Magazi

    28 AĞUSTOS 2008