假设我有一个如下所示的 C++ 函数:
double myfunction(double a, double b) {
// do something
}
然后我这样调用它:
double a = 1.0;
double b = 2.0;
double good_r = myfunction(a, b);
double bad_r = myfunction(b, a); // compiles fine
我想确保 a
和 b
永远不会以错误的顺序提供。
在 C++ 中确保这一点的最佳方法是什么?
其他语言允许命名参数,像这样:
double good_r = myfunction(a=a, b=b);
double bad_r = myfunction(a=b, b=a); // mistake immediately obvious
double bad_r = myfunction(b=b, a=a); // compiles fine
或者也许问题可以使用类型来部分解决,即
double my_type_safe_function(a_type a, b_type b) {
// do something
}
a_type a = 1.0;
b_type b = 2.0;
double good_r = myfunction(a, b);
double bad_r = myfunction(b, a); // compilation error
编辑:一些人问我所说的“错误顺序”是什么意思。我的意思是,在实际代码中 a
和 b
具有一定的意义。例如,参数可能改为 height
和 width
。它们之间的区别对于函数返回正确的结果非常重要。但是,它们都是 float ,并且都具有相同的尺寸(即长度)。此外,它们没有“明显”的顺序。编写函数声明的人可以假定 (width, height)
而使用该函数的人可以假定 (height, width)
。我想要一种方法来确保这不会错误地发生。使用两个参数很容易注意顺序,但在大型项目中,如果参数多达 6 个,就会出现错误。
理想情况下,我希望在编译时完成检查,并且不会影响性能(即在一天结束时,它们被视为普通的旧 float 或其他)。
最佳答案
这个怎么样:
struct typeAB {float a; float b; };
double myfunction(typeAB p) {
// do something
return p.a - p.b;
}
int main()
{
typeAB param;
param.a = 1.0;
param.b = 2.0;
float result = myfunction(param);
return 0;
}
当然,您在分配参数时仍然可能会搞砸,但这种风险很难避免:)
关于c++ - 如何防止以错误的顺序传递函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23244844/