使用模板将数组作为参数传递为参数

时间:2015-01-29 04:54:25

标签: c++ arrays templates reference

由于我不知道数组的大小,所以我使用size作为参数传递给我的函数。

这有效:

#include <cstddef>
#include <iostream>

template<class T, size_t N>
void takeArrayParam(T (&myArray)[N]) {
    for(auto i = std::begin(myArray); i != std::end(myArray); i++) {
        std::cout << *i << std::endl;
    }
}

int main() {
    int coolArray[10] = {1,2,3,4,5,6,7,8,9,10};
    takeArrayParam<int, 10>(coolArray);
    return 0;
}

这不起作用(编译错误):

#include <cstddef>
#include <iostream>

template<class T, size_t N>
void takeArrayParam(T (&myArray)[N]) {
    for(auto i = std::begin(myArray); i != std::end(myArray); i++) {
        std::cout << *i << std::endl;
    }
}

int main() {
    size_t size = 10;
    int coolArray[size];
    //int coolArray[10] = {1,2,3,4,5,6,7,8,9,10};
    takeArrayParam<int, size>(coolArray);
    return 0;
}

差异:coolArray[10]coolArray[size]

...谢谢

2 个答案:

答案 0 :(得分:3)

您需要将const添加到main()中的size定义中 这是因为在编译时需要知道堆栈上分配的数组的大小。

答案 1 :(得分:2)

问题是size不是constant expression在编译时已知),在您的情况下使用const或{{1}声明它会解决你的问题:

constexpr

在这种情况下使用constexpr size_t size = 10; 起作用,因为您使用文字const进行初始化,这是一个常量表达式。这在C ++标准部分10 expr.const 草案中有所说明:

  

条件表达式是核心常量表达式,除非它   涉及以下之一作为潜在评估的子表达式

并包含以下项目符号:

  

左值 - 右值转换(4.1),除非它适用于

     
      
  • 一个整数或枚举类型的glvalue,它引用具有前面初始化的非易失性const对象,已初始化   用一个常量表达式,或
  •   

请注意,数组大小也必须是常量表达式

5.19

正如我在回答Does “int size = 10;” yield a constant expression?几个编译器支持variable length arrays VLA )时所说的那样,这是一个C99功能作为C ++的扩展,但它不可移植,特别是Visual Studio不支持VLA。