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

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • TheScorpioTechno

    TheScorpioTe

    15 Aralık 2010
  • Vortez

    Vortez

    27 Temmuz 2009