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

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • MVLV28

    MVLV28

    17 Mart 2008
  • Myron and Nejusha dance

    Myron and Ne

    2 AĞUSTOS 2012