我不知道我所拥有的是否是编译器错误,或者我只是不知道我正在尝试做的事情的语法。想象一个需要 2 个数组引用的函数:
void takeArrays(const char (&str1)[4], const char (&str2)[4]) {
}
当使用以下命令调用时,这编译得很好:
takeArrays("foo", "bar");
我为什么要这样做?因为传递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]...);
不用说我得到的只是错误信息。我知道我正在尝试做的事情有点疯狂,但我真的很想知道这是否可能,如果可以,合适的语法是什么。提前致谢。