C++ 接口使函数具有可选参数而不是必需参数
假设我使用一个函数(来自另一个命名空间中的第三方API),该函数使用一些信息填充参数:C++ 接口使函数具有可选参数而不是必需参数,c++,c++03,C++,C++03,假设我使用一个函数(来自另一个命名空间中的第三方API),该函数使用一些信息填充参数: double foo::f(double x, double& info); 当我调用它时,我必须创建一个局部变量,即使我不关心填充值: const double x = 3.14159; double info = 0.0; const double y = foo::f(x, info); // Nothing to do with info 然后,我想为这个函数提供一个可选参数,而不是一个引
double foo::f(double x, double& info);
当我调用它时,我必须创建一个局部变量,即使我不关心填充值:
const double x = 3.14159;
double info = 0.0;
const double y = foo::f(x, info);
// Nothing to do with info
然后,我想为这个函数提供一个可选参数,而不是一个引用。有没有比下面的方法更常见/更好/更容易/更易读的方法
double ff(double x, double* info = 0)
{
double unused_info = 0.0;
double& info_ = ((bool)info ? *info : unused_info);
return foo::f(x, info_);
}
这是可行的,但它看起来有点笨拙
注意:出于兼容性原因,我不使用C++11。但是我对C++11解决方案很感兴趣,即使它不能回答这个问题。与其更改当前的实现,您只需添加一个带一个参数的重载函数:
double f(double x)
{
double info;
return f(x, info);
}
您只需添加一个带一个参数的重载函数,而无需更改当前实现:
double f(double x)
{
double info;
return f(x, info);
}
@ Caduchon。如果你可以(改变)改变一个函数,你也可以重载它,不管它的命名空间不在其中。@ N.M,你真的认为安全超载我自己的代码> LAPACK::DGESVD ?@ CADUCHON如果修改函数的签名是安全的,那么重载它也是同样安全的。它的名称空间不重要。@Caduchon-重载不必在同一名称空间中。只需使用using声明(在您选择的范围内)介绍这两种方法,并让重载解析根据参数的数量选择正确的方法。@Caduchon-
mynamespace
应该是libnamespace\u util
,并且using声明/指令的组合可以允许您使用任何类型的统一前缀。坦白说,在我看来,你只是过于悲观了。但正如他们所说,这是你的派对。Caduchon,如果你能(改变)改变一个函数,你也可以重载它,不管它的命名空间不在其中。@ N.M你真的认为安全超载我自己的代码> LAPACK::DGESVD ?@ CabuChon如果修改一个函数的签名是安全的,那么重载它也是同样安全的。它的名称空间不重要。@Caduchon-重载不必在同一名称空间中。只需使用using声明(在您选择的范围内)介绍这两种方法,并让重载解析根据参数的数量选择正确的方法。@Caduchon-mynamespace
应该是libnamespace\u util
,并且using声明/指令的组合可以允许您使用任何类型的统一前缀。坦白说,在我看来,你只是过于悲观了。但正如他们所说,这是你的派对。做任何适合你的事。