2013-08-07 52 views
2

的值在C++ 11返回類型爲有實施sqrt函數,對於正的和負double輸入值的工作原理的方法嗎?如果輸入是負值,我希望返回類型爲std::complex<double>,如果是正值,我想返回類型爲double。我意識到簡單的解決方案是總是返回std::complex<double>,但這不是我所期待的。基於輸入參數

下面我有我的第一次嘗試的例子,但是這不會編譯由於a在返回類型存在:

inline decltype((a > 0)?(double):(std::complex<double>)) sqrt(const double& a) 
{ 
    if(a > 0) 
    { 
     return std::sqrt(a); 
    } 
    else 
    { 
     return ((std::complex<double>(0.0,1.0))*std::sqrt(-a)); 
    } 
} 
+0

另外,我有這個功能在命名空間,以避免與'std'碰撞。 – OSE

+0

聲明它作爲'嵌入汽車的sqrt(const的雙&A) - > decltype(?(A> 0)(雙層):(的std ::複雜))'應該工作。 –

+0

@LoganMurphy好點。我應該改變'std :: sqrt()'。 – OSE

回答

5

不,這是不可能的。

類型是編譯時構造,和你的函數的類型是固定在編譯時。

分別爲constexpr「常量表達式」,那麼你可能已經使用模板來解決你的問題提供了論據。但是,對於動態輸入而言,這是不可能的。

2

您可能會返回一個boost::variant<double, std::complex<double>>(因爲決定必須在運行時作出),但這似乎爲您的代碼增加了很多複雜性而沒有真正的收益。

2

這是不可能的,而且可能更重要的是,即使你能做到這一點也許就不會是有用的。

由於函數可以返回複數,需要準備用於處理的複數調用代碼。如果你的代碼在任何情況下都需要能夠處理複數,那麼總是返回一個複數就更有意義了,如果輸入是正數,它的形式將是X + 0i(即虛數部分將等於0)。

理論上,您可以使用支持動態輸入的語言來完成此操作 - 但即使其中大部分都是基本靜態類型。如果您提供的輸入是實數,則結果也將是實數,如果輸入爲負數,則結果通常爲NaN或該訂單上的某些內容。如果(且僅當)您將輸入提供爲複數時,您會收到一個複數。