2012-03-30 181 views
0

我有一個函數,它採用完全相同的參數,但有時候我希望它返回一個double,而其他時候我希望它返回一個int。什麼是正確的方法來做到這一點?C++從函數返回double或int

我可以做函數重載,但重載函數的聲明必須根據參數列表中的類型和/或參數個數而不同。這些將是相同的,所以功能重載不適用(我不認爲)。

double calc(int value, int add, double mult) 
{ 
    // Sometimes I want this to return int. Sometimes double. 
    return (value + add) * mult; 
} 

我寧願不強制轉換爲int的時候這就是我期待或寫兩個函數(一個整數,另一個用於雙打)的類型。感謝您的任何建議。

+2

你能否詳細說明在什麼情況下你需要一個'int'而不是'double'? – templatetypedef 2012-03-30 17:58:16

+0

你將如何使用該功能?你能提供這兩種情況的例子嗎? – Andre 2012-03-30 18:01:20

+0

@templatetypedef - 是的,有時候,多參數是1.0,其他時候是1.375等。當它是1.0時,我想返回一個int。當它是1.375時,我想返回一個雙倍。 – 01100110 2012-03-30 18:02:48

回答

5

您可以創建第二個功能:

int calcInt(int value, int add, double mult) { 
    return calc(value, add, mult); 
} 

或者你可以使用一個模板:

template <class myType> 
myType calc(int value, int add, myType mult) { 
    return (value + add) * mult; 
} 

不能創建具有相同的名稱和參數不同的功能;編譯器不知道你想調用哪一個。

+0

個人而言,我更喜歡「calcInt」版本,另一個從代碼可讀性角度來看還不夠明確。它可能會掩蓋更深層次的邏輯/精度問題。 – JoshG 2012-03-31 01:38:13

+0

同意。但有時候知道選項是什麼會有幫助。 – 2012-03-31 01:42:21

5
template <typename T, typename U> 
T calc (const int value, const int add, const U mult) 
{ 
    return static_cast<T> ((value + add) * mult); 
} 

calc<double> (1, 2, 1.7); // returns double 
calc<int> (1, 2, 3.4); // returns int 
+0

謝謝,我想calc(1,2,1.0);返回一個int和calc(1,2,1.375);返回一個雙。多參數將始終爲1.0或1.375。它不只是1. – 01100110 2012-03-30 18:09:26

+0

我已經更新了答案。這應該現在工作。 – Anteru 2012-03-30 18:17:37

1

假設這是保持精度或類似的東西,我會定義自己的類型 - Number或類似的東西,並管理它是否是一個int或內部一倍。

+0

這與此有關。一個調用應用程序需要一個int。我給它1.0,它嚇壞了,因爲它期望1,而不是1.0,所以我試圖讓調用應用程序需要一個int時函數返回1。 – 01100110 2012-03-30 18:17:07

1

只是將它作爲double或使用模板,讓編譯器找出它。

如果你的INT = 1 然後雙擊= 1.0

它們是同號雙將與精度幫助。

只要它返回一個雙。它使用更多的內存,但它是本地範圍,所以誰在乎?