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

How to pass specificly sized array as argument?

本文关键字:数组 参数传递      更新时间:2023-10-16

我有一个函数,可以生成带有错误处理的安全输入,因此输入数字(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正确还是我完全错了?

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

一种解决方案是传递具有两个成员的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());
}

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

试试这个:

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