【发布时间】:2014-06-08 07:38:32
【问题描述】:
假设我有一个如下所示的 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。它们之间的区别对于函数返回正确结果非常重要。但是,它们都是浮点数,并且它们都具有相同的尺寸(即长度)。此外,他们没有“明显”的顺序。编写函数声明的人可以假设(width, height),而使用函数的人可以假设(height, width)。我想要一种方法来确保不会错误地发生这种情况。使用两个参数很容易注意顺序,但在大型项目中,最多有 6 个参数,错误就会蔓延。
理想情况下,我希望在编译时完成检查,并且不会影响性能(即在一天结束时,它们被视为普通的旧浮点数或其他)。
【问题讨论】:
-
a和b之间的区别是什么导致它们的顺序错误?您是否可以验证它们的实际值,并在它们无效时提前抛出异常/退出?如果它们都是同一类型,则没有真正万无一失的方法可以在编译时阻止它。
标签: c++ types arguments named-parameters