2011-10-17 120 views
5

假设我有一个返回重要结果和几个不重要结果的函数。我宣布它使不重要的结果作为参考返回:忽略函数返回参考结果

int CalculateStuff(int param1, int param2, int& result1, int& result2); 

我想调用这个函数来计算一些东西,但在呼叫的网站我想忽略不重要的结果。我可以如下做到这一点:

... 
int dummy1, dummy2; 
int result = CalculateStuff(100, 42, dummy1, dummy2); 
... // do something with the result 

我想考虑另一种方式做同样的不宣虚拟变量:

int result = CalculateStuff(100, 42, *new int, *new int); 

这有内存泄漏(不可接受),但是有一个优点显示我的意图(忽略结果)比“虚拟”名称更清楚。

int result = CalculateStuff(100, 42, auto_ptr(new int).get(), auto_ptr(new int).get()); 

是否合法:

所以,如果我写了如下会发生什么?当函数的代码执行时,临时整数是否仍然存在?我应该使用unique_ptr而不是auto_ptr吗?

(请不要建议重构我的代码,我可能会 - 但首先我想了解这个东西是如何工作的)

+1

添加为评论,因为它实际上并不回答你的问题 - 但我通常会声明一个临时调用_并传递,如果出现这种情况。 “CalculateStuff(100,42,_,_);似乎相当清楚 – jcoder

回答

4

它是合法的; auto_ptr对象将保持活动状态直到表达式结束(即函数调用)。但它像地狱一样丑陋。

只是超载功能:

int CalculateStuff(int param1, int param2, int& result1, int& result2); 
int CalculateStuff(int param1, int param2) { 
    int r1=0, r2=0; 
    return CalculateStuff(param1, param2, r1, r2); 
} 
+1

这仍然引发*相同的问题,你将如何实现第二个重载?你打算使用虚拟变量,还是'* new int'或'auto_ptr',或者什么,以便你可以从第二个调用第一个重载? – Nawaz

+0

@Nawaz例如,通过创建两个临时变量,或者调用某个第三个实现(例如,带有你建议的指针的实现) – hamstergene

+0

但是 – Nawaz

3

推荐的方法,如果你有在功能控制将是:返回一个std::tuple(或boost::tuple)与所有结果或写,这并不需要额外的过载变量。

3

这里是我的建议:如果您必须要求SO找出代码及其语义的正确性,那么代码无法明确表达您的意图

我认为第一个版本(与dummy1dummy2)是最透明的,显然是正确的。

如果你发现自己多次调用功能,又不想可选的结果,你可以提供一个过载:

int CalculateStuff(int param1, int param2, int& result1, int& result2) {} 

int CalculateStuff(int param1, int param2) { 
    int unwanted1, unwanted2; 
    return CalculateStuff(param1, param2, unwanted1, unwanted2); 
} 
4

根据Bjarne的Stroustrup的,如果一些参数是可选的,它是制作一个理想的情况下,他们指针类型,这样就可以通过NULL当你不需要来传递参数为他们:

int CalculateStuff(int param1, int param2, int * result1, int * result2); 

及用途:

int result = CalculateStuff(100, 42, NULL, NULL); 

所有其他的替代品将不如这个,或至少不是更好比这个。

当然,执行CalculateStuff必须检查参数是否为NULL

3

您可以创建一个向int&提供隐式(或显式)转换的类。

struct ignored 
{ 
    int n; 
    operator int&() { return n; } 
}; 

n = CalculateStuff(a, b, ignored(), ignored()); 

您可以进一步将其作为模板并添加const重载。

+0

不会被忽略的类型是const并给你带来麻烦? –

+0

@WinstonEwert:为什么?临时不能直接绑定到非const引用,但可以调用一个非常量方法临时对象,这就是它正在利用的。 – UncleBens

2

这是合法的,但不能保证不会泄漏内存,请参阅问题3 here例如。

实施可选输出的正确和惯用的方式是通过 一个指针,传递NULL当你不想要的结果,并通过该指针之前写在功能测试 为NULL