我有一个函数可以生成一个带错误处理的安全输入,因此输入数字(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
对于默认数组值是正确的还是我完全错了?
答案 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());
}
强制调用者在第一个(在这种情况下,使用默认边界)之后不提供参数,或者两个(指定边界) - 只传递一个额外的参数将是可诊断的错误。与你提出的问题的唯一区别是,这不需要(隐式或显式地)构造一个数组或其他数据结构来调用函数 - 这对于调用者来说可能更容易处理。