我使用了一个函数,该函数使用2个参考参数返回值,只有这个值中的一个会引起我的兴趣。有没有一种合适的方法可以在一行中完成。
我将用代码解释自己
功能代码
void Limits (double& min, double &max)
{
min = MIN;
max = MAX;
}
使用功能
double min;
double unused;
Limits(min, unused);
// using myDouble but not unused
我想写的是类似的东西
double min;
Limits(min, double());
如果没有事先正确声明该对象,我将找不到方法。是否有一个优雅的解决方案?
我无法修改功能。
我不确定为什么必须声明一个附加变量是一个问题。无论如何,如果您不能修改函数,请进行包装:
void MyLimits(double& min) {
double unused;
Limits(min, unused);
}
或者您可以做一些时髦的事情:
double min;
Limits(min, *std::unique_ptr<double>(new double));
最明显的解决方案是使用指针:
void
Limits( double* min, double* max )
{
if ( min != nullptr ) {
*min = myMin;
}
if ( max != nullptr ) {
*max = myMax;
}
}
// ...
double min;
Limits( &min, nullptr );
或者,您可以只定义单独的功能:
void Limits( double& min, double& max );
void UpperLimit( double& max );
void LowerLimit( double& min );
编辑:
由于原始海报已表明他不能修改函数,他应该用指针:
void myLimits( double* min, double* max )
{
double ignore;
Limits( min == nullptr ? ignore : *min,
max == nullptr ? ignore : *max );
}
不,但是您可以有一个宏可以为您轻松完成此操作。我的以下示例向您展示了如何执行此操作。
#define LIMITS(min) { double unused; Limits(min, unused); }
...
// Later in your code:
double min;
LIMITS(min);
注意,我在宏中添加了{}。这是为未使用的变量创建本地作用域。然后,您可以从同一函数中使用该宏。
可为空的引用。因此,您将无法使用指针。
void Limits(double* min, double* max)
{
if (min) *min = this->min_;
if (max) *max = this->max_;
}
int min;
Limits(&min, NULL);
[我知道我知道,你会说“指针不好!”。指针还不错,但是如果您really不喜欢它,我建议您调查boost::optional
。就我个人而言,我觉得这不必要地增加了代码复杂性。
我认为,使用C ++ 11及其右值引用,您可以实现所请求的单行代码。内容如下:
template<class T> T& make_dummy_out(T&& t) { return t; }
然后您可以按以下方式调用Limit函数:
double min;
Limits(min, make_dummy_out(double()));
这很安全,因为临时创建的double()
的生存期将一直到语句结束,即Limits()
调用完成之后。
注意,make_dummy_out()
基本上与std::move()
相反:std::move()
将左值引用显式转换为右值引用,而make_dummy_out()
将右值引用显式转换为左值引用。当然,您只需要声明一次模板函数,然后可以在需要时使用它来创建虚拟输出参数。