2012-11-06 40 views
7

我不知道如果我有什麼是編譯器的bug,或者我只是不知道爲了什麼,我試圖做的語法。想象一下,一個函數,2個數組引用:variadic模板數組引用參數的語法是什麼?

takeArrays("foo", "bar"); 

我爲什麼要做到這一點:當叫

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

編譯沒有問題?因爲傳遞const char*會丟失字符串文字的大小信息,這對我正在做的事情很重要。

我真正想做的事情,但是,是通過數組引用的可變參數數量。這是事情變得稍微醜陋的地方(它變得更糟)。我天真地想這:

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

,並得到"error: variable or field ‘takeArrays’ declared void""error: expected primary-expression before ‘const’"(GCC 4.6)。所以,我想這一點:

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

,並得到"no matching function for call to ‘takeArrays(const char [4], const char [4])’""candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])"。這是不可讀的,但似乎接近我想要的。我已經嘗試了許多變化,似乎無法讓它編譯。

假設有寫上面有道,我真正想要做的是電話:

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

並獲得不同大小的陣列的可變參數列表,即撥打以上應由擴大編譯:

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

這是第一次覺得我試圖做的,我嘗試是這樣的:

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

不用說我得到的只是錯誤消息。我知道我想要做的事有點瘋狂,但我真的很想知道它是否可能,如果有的話,適當的語法是什麼。提前致謝。

回答

9

爲相同的元素類型的可變參數陣列的語法是:

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

這類似於普通可變參數const引用語法:

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

一個簡單的方法是要記住,省略號緊靠參數名稱之前。

+0

是的,工作。謝謝!我會記住參數名稱技巧前的省略號。出於好奇,我會如何寫出相同大小的原始參數?我嘗試了'template void takeArrays(cont char Args(&... args([4])'和'const char(Args&... args)[4]'而那些不工作 –

+5

@不能做出針對你不能寫一個可變參數函數模板服用多種'int's同樣的原因,工作ÁtilaNeves:'模板無效美孚(int ... i/*不起作用:這裏沒有擴展* /);通常的解決方法是允許使用不同元素類型的相同大小的數組,即'template void foo(T(&... args)[Size]);'。然後你可以選擇添加一個'static_assert'來強制所有'T'是'const char'。 –

相關問題