如何传递特定大小的数组作为参数?

时间:2017-08-06 04:43:03

标签: c++ arrays function arguments

我有一个函数可以生成一个带错误处理的安全输入,因此输入数字(int)更加清晰。但我希望其中一个参数是一个长度为2的可选数组,它包含所需变量输入的边界。

这就是我现在所拥有的:

//function prototype
void input_number(int* variable, string text = "Input : ", int boundaries[2] = NULL);

//function call
int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});

这不起作用,抛出错误cannot convert '<brace-enclosed initializer list>' to 'int*' for argument '3' to 'void input_number(int*, std::__cxx11::string, int*)'

如何将长度为2的数组传递给函数?

另外,int[] = NULL对于默认数组值是正确的还是我完全错了?

2 个答案:

答案 0 :(得分:2)

试试这个:

void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {});

答案 1 :(得分:2)

错误消息解释了问题 - 当一个数组作为参数传递给函数时,数组被转换为指针(指向第一个元素)。

一种解决方案是传递具有两个成员的struct类型,并为其提供默认值。一个例子是,因为std::array实际上是模板化结构

void input_number(int* variable, std::string text = "Input : ", const std::array<int, 2> &bounds = {});

int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});

但是,任何可以存储两个值的数据结构,并使用initializer_list<int>构造。标准库中还有其他类型的例子 - std::array不是唯一的例子。

就个人而言,我也会省略第一个参数,并将其作为返回值

int input_number(std::string text = "Input : ", const std::array<int, 2> &bounds = {});

 // to call

int variable = input_number("Choose a number between 0 and 10 : ", {0, 10});

这有一个问题,即函数无法报告错误(除了抛出异常),但你的方法也是如此。

就个人而言,我也不会将边界作为默认参数传递。我只是用函数重载来做;

 int input_number(std::string input, int lower_bound, int upper_bound)
 {
     // do whatever you want
 }

 int input_number(std::string input)
 {
      return input_number(input, std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
 }

强制调用者在第一个(在这种情况下,使用默认边界)之后不提供参数,或者两个(指定边界) - 只传递一个额外的参数将是可诊断的错误。与你提出的问题的唯一区别是,这不需要(隐式或显式地)构造一个数组或其他数据结构来调用函数 - 这对于调用者来说可能更容易处理。