C++ 如何将特定大小的数组作为参数传递?
我有一个函数,可以生成带有错误处理的安全输入,因此输入数字(int)更简洁。但我希望其中一个参数是长度为2的可选数组,该数组包含所需变量输入的边界 以下是我目前拥有的:C++ 如何将特定大小的数组作为参数传递?,c++,arrays,function,arguments,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,
//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});
这不起作用,抛出错误无法将参数“3”的“”转换为“int*”,将其转换为“void input\u number(int*,std::u cxx11::string,int*)”
如何将长度为2的数组传递给函数
另外,默认数组值的int[]=NULL是正确的还是我完全错了?尝试以下方法:
void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {});
void input_number(int*变量,string text=“输入:”,std::数组边界={});
试试这个:
void input_number(int* variable, string text = "Input : ", std::array<int, 2> boundaries = {});
void input_number(int*变量,string text=“输入:”,std::数组边界={});
错误消息解释了问题-当数组作为参数传递给函数时,它将转换为指针(指向第一个元素)
一种解决方案是传递一个有两个成员的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});
这存在函数无法报告错误的问题(除了抛出异常),但您的方法也是如此
就个人而言,我也不会将边界作为默认参数传递。我只需要使用函数重载就可以了
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());
}
int-input\u-number(std::string-input,int-lower\u-bound,int-upper\u-bound)
{
//你想干什么就干什么
}
int输入_编号(标准::字符串输入)
{
返回输入\编号(输入,标准::数值\限制::最小(),标准::数值\限制::最大());
}
强制调用方在第一个参数(在这种情况下,使用默认边界)之后不提供任何参数,或者在第二个参数(指定边界)之后不提供任何参数—仅传递一个附加参数将是可诊断的错误。与您所问的唯一不同之处在于,这不需要(隐式或显式)构造数组或其他数据结构来调用函数,这对调用方来说更容易处理。错误消息解释了问题-数组被转换为指针(指向第一个元素)当作为参数传递给函数时
一种解决方案是传递一个有两个成员的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});
这存在函数无法报告错误的问题(除了抛出异常),但您的方法也是如此
就个人而言,我也不会将边界作为默认参数传递。我只需要使用函数重载就可以了
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());
}
int-input\u-number(std::string-input,int-lower\u-bound,int-upper\u-bound)
{
//你想干什么就干什么
}
int输入_编号(标准::字符串输入)
{
返回输入\编号(输入,标准::数值\限制::最小(),标准::数值\限制::最大());
}
强制调用方在第一个参数(在这种情况下,使用默认边界)之后不提供任何参数,或者在第二个参数(指定边界)之后不提供任何参数—仅传递一个附加参数将是可诊断的错误。与您所问的唯一不同之处在于,这不需要(隐式或显式)构造数组或其他数据结构来调用函数,这对调用方来说可能更容易处理。将数组作为常量&,但这正是当时的偏好:只需要打开更多的用例。在这个案例中,@TheKitchenSink一无所获。根据错误消息,Asker似乎在调用中使用了{}
。不幸的是,{}并不意味着“没有数组”,而是意味着“一个填充了0的数组”。我的措辞很糟糕。我应该写{0,10}
。如果参数在编译时已知,请使用模板参数而不是函数参数。将数组作为常量也是一个不错的建议,但在这一点上,这是首选:只需打开更多的用例。在这种情况下@TheKitchenSink没有任何好处。根据错误消息,Asker似乎在调用中使用了{}
。不幸的是,{}并不意味着“没有数组”,而是意味着“一个填充了0的数组”。我的措辞很糟糕。我应该写{0,10}
。如果参数在编译时已知,请使用模板参数而不是函数参数。谢谢您的详细回答!很多额外的建议,我喜欢。是的,即使我想避免函数重载,我想除了使用它们,我肯定别无选择!读一读,就像你刚才写的那样,重载不会比不重载占用更多的空间。。非常好的解决方案,谢谢!(+在输入之后的最后一个代码块中有一个额外的闭括号,可能会被删除)感谢您的详细回答!很多额外的建议,我喜欢。是的,即使我想避免函数重载,我想除了使用它们,我肯定别无选择!读一读,就像你刚才写的那样,重载不会比不重载占用更多的空间。。非常好的解决方案,谢谢!(+在输入之后的最后一个代码块中有一个额外的圆括号,可能会被删除)