c++ - 如何防止以错误的顺序传递函数参数?

标签 c++ types arguments named-parameters

假设我有一个如下所示的 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

我想确保 ab 永远不会以错误的顺序提供。 在 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

编辑:一些人问我所说的“错误顺序”是什么意思。我的意思是,在实际代码中 ab 具有一定的意义。例如,参数可能改为 heightwidth。它们之间的区别对于函数返回正确的结果非常重要。但是,它们都是 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/

相关文章:

c++ - 在函数内部创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?

javascript - 幻灯片放映 JavaScript 错误

字符串中的R变量

c++ - 最佳实践 : Passing Arrays of Data

c++ - 参数如何从 Qml 传递到 C++?

python - 从 pandas Dataframe 中的混合 dtype 列中删除破折号字符串

c# - 有没有更简单的方法将一组变量作为数组传递

python - 创建以动态数量的值作为参数的字典

c++ - 模板模板参数

types - 在 GraphQL 类型定义中创建条件属性