Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将对数组的可变数量的引用传递给具有可变模板的函数_C++_Templates_C++11_Variadic Templates - Fatal编程技术网

C++ 将对数组的可变数量的引用传递给具有可变模板的函数

C++ 将对数组的可变数量的引用传递给具有可变模板的函数,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,我知道如何编写接受可变数量参数的可变模板函数: template<int I, typename... Rest> void f() { // whatever } 模板 void f(){ //随便 } 我知道如何编写一个模板函数来接受对数组的引用: template<typename T, unsigned int Length> void f(T(&arr)[Length]) { // whatever } 模板 空隙f(T和arr)[

我知道如何编写接受可变数量参数的可变模板函数:

template<int I, typename... Rest>
void f() {
    // whatever
}
模板
void f(){
//随便
}
我知道如何编写一个模板函数来接受对数组的引用:

template<typename T, unsigned int Length>
void f(T(&arr)[Length]) {
    // whatever
}
模板
空隙f(T和arr)[长度]){
//随便
}
但我想不出如何将两者结合起来,使函数接受对数组的可变数量的引用

我的第一次尝试是

template<typename T, unsigned int Length>
unsigned int arrlen(T(&)[Length]) {
    return Length;
}

template<typename T, unsigned int Length>
int f(T(&arr)[Length]) {
    return Length;
}

template<typename T, unsigned int Length, typename... Rest>
int f(T(&arr)[Length], Rest... rest) {
    return Length + f(rest...);
}

int main() {
    int a[] = {1 , 2, 3}, b[] = {1, 2, 3, 4, 5}, c[] = {1};

    cout << f(a, b, c);
}
模板
无符号整数arrlen(T(&)[长度]){
返回长度;
}
模板
int f(T&arr)[长度]){
返回长度;
}
模板
int f(T(&arr)[长度],剩余…剩余){
返回长度+f(剩余…);
}
int main(){
int a[]={1,2,3},b[]={1,2,3,4,5},c[]={1};

cout如果您只想对多个数组的长度求和,可以直接这样做:

template<typename T, unsigned int Length>
int f(const T (&)[Length]) {
    return Length;
}

template<typename T, unsigned int Length, typename... Args>
int f(const T (&)[Length], Args&... rest) {
    return Length + f(rest...);
}

int main() {
    int a[] = { 1, 2, 3 }, b[] = { 1, 2, 3, 4, 5 }, c[] = { 1 };

    std::cout << f(a, b, c);
}
模板
整数f(常数T(&)[长度]){
返回长度;
}
模板
int f(常数T(&)[Length],参数和…rest){
返回长度+f(剩余…);
}
int main(){
int a[]={1,2,3},b[]={1,2,3,4,5},c[]={1};

std::cout您可以使用
std::extent
获取数组外部维度的范围,并可变地将其相加:

#include <type_trait>

template <typename Arr, typename ...Rest> struct extent_sum
: std::integral_constant<std::size_t,
                         std::extent<T>::value + extent_sum<Rest...>::value> { };

template <typename T> struct extent_sum<T>
: std::integral_constant<std::size_t, std::extent<T>::value> { };
#包括
模板结构范围和
:std::积分_常数{};
模板结构范围和
:std::积分_常数{};
用法:

const std::size_t n = extent_sum<int[2], char[4], float[3], bool>::value;
const std::size\u t n=extent\u sum::value;

只需使用
std::array
就可以了,忘记原始数组的胡说八道。@CatPlusPlus这是一个简单的解决方法,不会帮助我了解这里发生了什么。@CatPlusPlus,实际上这会带来同样的问题不,不会。
std::array
不会衰减到指针,所以你不必使用作为模板传递的大小ate参数。@CatPlusPlus啊,你说得对,我忘了问题是由指向指针的数组衰变引起的,所以我唯一缺少的是
Args
前面的
&
?@SethCarnegie:后面,当然?@lightness racesinorbit取决于单词所面对的方向:)啊,那么愚蠢的错误。
Args&
的意思是什么所有参数都是通过引用传递的,
Args
意味着它们都是通过值传递的吗?@Seth:是的,但是
Args&&
会根据每个参数引用折叠,因此在一般情况下,如果您希望同时支持右值和左值(此处不需要),最好使用这种方法.Kerrek,
constexpr
可能是首选(从GCC 4.6 AFAIR开始):。
const std::size_t n = extent_sum<int[2], char[4], float[3], bool>::value;