我不知道如果我有什麼是編譯器的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]...);
不用說我得到的只是錯誤消息。我知道我想要做的事有點瘋狂,但我真的很想知道它是否可能,如果有的話,適當的語法是什麼。提前致謝。
是的,工作。謝謝!我會記住參數名稱技巧前的省略號。出於好奇,我會如何寫出相同大小的原始參數?我嘗試了'template void takeArrays(cont char Args(&... args([4])'和'const char(Args&... args)[4]'而那些不工作 –
@不能做出針對你不能寫一個可變參數函數模板服用多種'int's同樣的原因,工作ÁtilaNeves:'模板 *要放什麼東西在這裏?? * />無效美孚(int ... i/*不起作用:這裏沒有擴展* /);通常的解決方法是允許使用不同元素類型的相同大小的數組,即'template void foo(T(&... args)[Size]);'。然後你可以選擇添加一個'static_assert'來強制所有'T'是'const char'。 –