用于未使用的out参数参考的单行解决方案

问题描述 投票:8回答:5

我使用了一个函数,该函数使用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());

如果没有事先正确声明该对象,我将找不到方法。是否有一个优雅的解决方案?

我无法修改功能。

c++ parameters parameter-passing
5个回答
4
投票

我不确定为什么必须声明一个附加变量是一个问题。无论如何,如果您不能修改函数,请进行包装:

void MyLimits(double& min) {
  double unused;
  Limits(min, unused);
}

或者您可以做一些时髦的事情:

double min;

Limits(min, *std::unique_ptr<double>(new double));

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 );
}

1
投票

不,但是您可以有一个宏可以为您轻松完成此操作。我的以下示例向您展示了如何执行此操作。

#define LIMITS(min) { double unused; Limits(min, unused); }
...
// Later in your code:
double min;
LIMITS(min);

注意,我在宏中添加了{}。这是为未使用的变量创建本地作用域。然后,您可以从同一函数中使用该宏。


1
投票

可为空的引用。因此,您将无法使用指针。

void Limits(double* min, double* max)
{
    if (min) *min = this->min_;
    if (max) *max = this->max_;
}

int min;
Limits(&min, NULL);

[我知道我知道,你会说“指针不好!”。指针还不错,但是如果您really不喜欢它,我建议您调查boost::optional。就我个人而言,我觉得这不必要地增加了代码复杂性。


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

© www.soinside.com 2019 - 2024. All rights reserved.