2011-10-17 170 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