我使用一个使用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());
如果没有事先正确声明对象,我就找不到办法。有优雅的解决方案吗?
我无法修改此功能。
答案 0 :(得分:4)
我不确定为什么要声明一个额外的变量是一个问题。无论如何,如果你不能修改函数,请创建一个包装器:
void MyLimits(double& min) {
double unused;
Limits(min, unused);
}
或者你可以像这样做一些时髦的事情:
double min;
Limits(min, *std::unique_ptr<double>(new double));
答案 1 :(得分:2)
最明显的解决方案是使用指针:
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 );
}
答案 2 :(得分:1)
不,但是您可以拥有一个只为您执行此操作的宏。我的以下示例向您展示了如何执行此操作。
#define LIMITS(min) { double unused; Limits(min, unused); }
...
// Later in your code:
double min;
LIMITS(min);
请注意,我在我的宏中添加了{}。这是为未使用的变量创建本地范围。然后,您可以在同一个函数中使用宏。
答案 3 :(得分:1)
什么是可空的参考。所以你一直坚持使用指针。
void Limits(double* min, double* max)
{
if (min) *min = this->min_;
if (max) *max = this->max_;
}
int min;
Limits(&min, NULL);
我知道我知道,你会说&#34;指针不好!&#34;。指针也不错,但如果你真的不喜欢它,我建议调查boost::optional
。就个人而言,我觉得这会不必要地增加代码复杂性。
答案 4 :(得分:0)
我认为,使用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()
将右值引用显式转换为右值引用左值参考。当然,您只需要声明一次模板函数,然后就可以在需要时使用它来创建虚拟输出参数。