2012-11-06 14 views
7

Sahip olduğum şey bir derleyici hatası mı, yoksa sadece yapmaya çalıştığım şeyin sözdizimini bilmiyorsam bilmiyorum.Variadic şablon dizi referans parametreleri için sözdizimi nedir?

takeArrays("foo", "bar"); 

Bunu neden isteyeyim: ile adlandırılan bu ince derler

void takeArrays(const char (&str1)[4], const char (&str2)[4]) { 
} 

: 2 dizi başvuruları alır bir işlevi düşünün? const char* geçişi, dize değişmezinin boyut bilgilerini kaybedeceğinden ve yaptığım şey için bu önemli.

Gerçekten yapmak istediğim, çok sayıda dizi başvurusu iletiyor. İşler biraz çirkinleşiyor (daha da kötüye gidiyor).

template<typename... Args> 
void takeArrays(const char (&Args... strs)[4]) { 
} 

Ve "error: variable or field ‘takeArrays’ declared void" ve "error: expected primary-expression before ‘const’" (gcc 4.6) var: Ben safça bu çalıştı.

template<typename... Args> 
void takeArrays(const char (&(Args... strs))[4]) { 
} 

Ve "no matching function for call to ‘takeArrays(const char [4], const char [4])’" ve "candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])" var: Ben bu çalıştı. Okunamayan ama istediğim şeye yakın görünüyor. Birçok varyasyonu denedim ve derlemeyi başaramıyorum. Çağrı yukarıda tarafından genişletilmesi gerektiğini, yani

takeArrays("foo", "foobar", "longerstring"); 

Ve farklı boyutlarda Dizilerin variadic listesini almak: Gerçekten ne yapmak istediğinizi yukarıdaki yazmak için uygun bir yol olmasa varsayarsak

çağrıdır derleyici için:

void takeArrays(const char (&str1)[4], const char (&str2)[7], 
       const char (&str3)[13]); 

yaptığım çalıştı ilk düşünüyorum, ve benim girişimi gibi bir şey oldu Hangi:

template<size_t... Sizes> 
void takeArrays(const char (&strs)[Sizes]...); 

Tüm sahip olduğumu söylemek hata iletileri oldu. Yapmaya çalıştığım şeyin biraz çılgın olduğunun farkındayım ama gerçekten mümkün olup olmadığını bilmek istiyorum ve eğer öyleyse uygun sözdiziminin ne olduğunu bilmek istiyorum. Şimdiden teşekkürler.

cevap

9

aynı eleman türü değişkin diziler söz dizimi,

template<size_t... Sizes> 
void takeArrays(const char (&...args)[Sizes]); 

bu genel değişkin sabit başvuru sözdizimi benzer:

template<typename... Args> 
void takeArrays(const Args &...args); 

hatırlamak için kolay bir yol üç nokta olmasıdır parametre adından hemen önce gider.

+0

Evet, işe yaradı. Teşekkürler! Parametre adı trick önce elips hatırlayacağım. Merakla, aynı boyuttaki orijinal parametreleri nasıl yazarım? Şablonu void takeArrays denedim (cont char Args (& ... args ([4]) 've' const char (Args & ... args) [4] –

+5

@ ÁtilaNeves Aynı nedenden dolayı çalışamazsınız, çok değişkenli bir intrüzyon fonksiyon şablonu yazamazsınız: int's: 'template void foo (int ... i/* işe yaramıyor: Burada genişletmek için bir paket yok * /); 'Her zamanki çözüm, farklı boyuttaki elemanlarla aynı boyuta sahip dizilere izin vermektir, yani 'template void foo (T (& ... args) [Size]); 'Daha sonra isteğe bağlı olarak tüm' T' const char'unu zorlamak için bir 'static_assert' ekleyebilirsiniz. –

İlgili konular