2016-01-02 61 views
1

我有一個函數,它需要一個「auto」並返回一個「auto」。該函數使用數字類型(例如,複數,整數或雙精度)。但是,根據函數的結果,我需要明確地返回一些內容。例如,如果將一個複數傳遞給函數,如果數字的「實數」部分小於零,則需要返回「複數(0,0)」。代碼看起來類似以下內容:明確返回模板參數

if(myNumber<0){ return 0.0;} else{ return myNumber; } 

當然現在我有超載「小於」操作,但困難的是如何讓返回0時mynumber的不是雙。我已經重載了「=」運算符來允許將雙精度賦值給複數,但是我仍然在編譯錯誤。

有什麼好方法可以做到這一點?

編輯:

我的完整代碼如下所示。再次

auto BSCall(const auto &S0, const auto &k, const auto &discount, const auto &sigma){ 
if(sigma<=0){ 
    return 0.0; 
} 
else{ 
    double s=sqrt(2.0); 
    auto d1=log(S0/(discount*k))/(sigma)+sigma*.5; 
    return S0*(.5+.5*erf(d1/s))-k*discount*(.5+.5*(erf((d1-sigma)/s))); 
}} 

編輯:

事實證明,我沒有我的課具有了雙重構造。我的代碼工作時,我有運算符「=」重載和構造函數有一個單一的雙。

+1

「我有一個函數w這需要一個「自動」並返回一個「自動」。 「這並不在C++ 14存在。您使用的是GCC的擴展? –

+0

是您的複合型'的std ::複雜'? –

+0

不,我創建了自己的類...我希望它是適用於其他數值類型爲好。 – user9403

回答

2

我想你碰到的問題,因爲你有兩個返回將返回不同的類型,而編譯器不能定爲返回類型使用哪種類型。

你可以把你的計算成一個輔助函數解決這個問題:

auto BSCallHelper(
     const auto &S0, 
     const auto &k, 
     const auto &discount, 
     const auto &sigma 
     ) 
{ 
    double s=sqrt(2.0); 
    auto d1=log(S0/(discount*k))/(sigma)+sigma*.5; 
    return S0*(.5+.5*erf(d1/s))-k*discount*(.5+.5*(erf((d1-sigma)/s))); 
} 

然後你可以使用助手功能,讓您的返回類型是明確的:

auto BSCall(
     const auto &S0, 
     const auto &k, 
     const auto &discount, 
     const auto &sigma 
     ) -> decltype(BSCallHelper(S0,k,discount,sigma)) 
{ 
    if(sigma<=0){ 
     return 0.0; 
    } 

    return BSCallHelper(S0,k,discount,sigma); 
} 

你也可以使用?:運算符來解析一個通用類型:

auto BSCall(
     const auto &S0, 
     const auto &k, 
     const auto &discount, 
     const auto &sigma 
     ) 
{ 
    return (sigma<=0) ? 0 : BSCallHelper(S0,k,discount,sigma); 
} 
+0

編輯:我仍然得到原始錯誤(無法從'雙'轉換'0.0') – user9403

+0

@ user9403:你使用哪個編譯器和版本? –

+0

@ user9403:我沒有看到那個錯誤:https://ideone.com/sVm2Xr –

3

我看到有兩種方式:

首先是嘗試初始化列表:

if(myNumber<0){ 
    return {}; // <= it means you return T() 
}else{ 
    return myNumber; 
} 

二是使用std::result_oftype_traits頭。

if(myNumber<0){ 
    return std::result_of<YourFunctionReference>::type(); 
}else{ 
    return myNumber; 
} 

當然你的功能是模板化的,所以我不太確定第二種方法是否可行。請從您的項目發佈其他代碼,以便我能告訴您如何在您的案例中使用std::result_of

+0

自動返回,返回爲'return {};'工作? – Yakk