未使用的输出参数参考的一行解决方案

时间:2014-11-18 16:46:54

标签: c++ parameters parameter-passing

我使用一个使用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());

如果没有事先正确声明对象,我就找不到办法。有优雅的解决方案吗?

我无法修改此功能。

5 个答案:

答案 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()将右值引用显式转换为右值引用左值参考。当然,您只需要声明一次模板函数,然后就可以在需要时使用它来创建虚拟输出参数。