use*_*470 5 c++ types arguments named-parameters
假设我有一个 C++ 函数,如下所示:
double myfunction(double a, double b) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
然后我这样称呼它:
double a = 1.0;
double b = 2.0;
double good_r = myfunction(a, b);
double bad_r = myfunction(b, a); // compiles fine
Run Code Online (Sandbox Code Playgroud)
我想确保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
Run Code Online (Sandbox Code Playgroud)
或者也许可以使用类型部分解决问题,即
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
Run Code Online (Sandbox Code Playgroud)
编辑:有几个人问我所谓的“错误顺序”是什么意思。我的意思是,在真正的代码中a,b有一定的意义。例如,参数可能是heightand width。它们之间的区别对于函数返回正确结果非常重要。然而,它们都是浮点数并且它们都具有相同的尺寸(即长度)。此外,它们没有“明显”的顺序。编写函数声明(width, height)的人可以假设,使用函数的人可以假设(height, width)。我想要一种方法来确保这不会发生错误。使用两个参数很容易注意顺序,但在一个大型项目中,最多有 6 个参数,错误会蔓延。
理想情况下,我希望在编译时完成检查,并且不会影响性能(即在一天结束时,它们被视为普通的旧浮点数或其他任何东西)。
我认为您已经使用类型提供了最简单的解决方案。
一种替代方法是使用构建器类和方法链接。喜欢:
class MyfunctionBuilder {
MyFunctionBuilder & paramA(double value);
MyFunctionBuilder & paramB(double value);
double execute();
(...)
}
Run Code Online (Sandbox Code Playgroud)
你会这样使用:
double good_r = MyFunctionBuilder().paramA(a).paramB(b).execute();
Run Code Online (Sandbox Code Playgroud)
但这需要编写很多额外的代码!