可变参数模板数组引用参数的语法是什么?

Áti*_*ves 7 c++ variadic-templates c++11

我不知道我有什么是编译器错误,或者我只是不知道我正在尝试做什么的语法.想象一个需要2个数组引用的函数:

void takeArrays(const char (&str1)[4], const char (&str2)[4]) {
}
Run Code Online (Sandbox Code Playgroud)

调用时编译正常:

takeArrays("foo", "bar");
Run Code Online (Sandbox Code Playgroud)

我为什么要这样做?因为传递const char*丢失了字符串文字的大小信息,这对我正在做的事情很重要.

但是,我真正想要做的是传递一个可变数量的数组引用.事情变得有点丑陋(变得更糟).我天真地试过这个:

template<typename... Args>
void takeArrays(const char (&Args... strs)[4]) {
}
Run Code Online (Sandbox Code Playgroud)

和GOT "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]) {
}
Run Code Online (Sandbox Code Playgroud)

并得到了"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");
Run Code Online (Sandbox Code Playgroud)

并获得不同大小的数组的可变列表,即上面的调用应该由编译器扩展为:

void takeArrays(const char (&str1)[4], const char (&str2)[7],
                const char (&str3)[13]);
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的第一个想法,我的尝试是这样的:

template<size_t... Sizes>
void takeArrays(const char (&strs)[Sizes]...);
Run Code Online (Sandbox Code Playgroud)

不用说我得到的只是错误信息.我知道我正在尝试做的事情有点疯狂,但我真的想知道它是否可能,如果可能,那么适当的语法是什么.提前致谢.

eca*_*mur 9

相同元素类型的可变数组的语法是:

template<size_t... Sizes>
void takeArrays(const char (&...args)[Sizes]);
Run Code Online (Sandbox Code Playgroud)

这类似于一般的可变参数const引用语法:

template<typename... Args>
void takeArrays(const Args &...args);
Run Code Online (Sandbox Code Playgroud)

一种容易记住的方法是省略号紧跟在参数名称之前.

  • @ÁtilaNeves由于同样的原因,你无法编写一个可变参数的函数模板,因为你需要多个`int`s:`template </*这里放什么?*/> void foo(int ... i/*不起作用:没有包扩展到这里*/);`.通常的解决方法是允许具有不同元素类型的相同大小的数组,即`template <typename ... T,std :: size_t Size> void foo(T(&... args)[Size]);` .然后,您可以选择添加`static_assert`来强制所有`T`都是`const char`. (5认同)