在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 :(得分:5)
不,这是不可能的。
类型是编译时构造,函数的类型在编译时是固定的。
如果参数作为constexpr
“常量表达式”提供,那么您可能已经使用模板来解决问题。但是,对于动态输入,这根本不可能。
答案 1 :(得分:2)
你可以返回一个boost::variant<double, std::complex<double>>
(因为必须在运行时做出决定),但这似乎为你的代码增加了很多复杂性而没有真正的好处。
答案 2 :(得分:2)
这是不可能的,也许更重要的是,即使你能做到这一点也可能没用。
由于函数可以返回一个复数,因此需要准备调用代码来处理复数。如果你的代码在任何情况下都需要能够处理复数,那么总是返回一个复数是更有意义的,如果输入是正数,它将是X + 0i
形式(即,虚部将等于0)。
理论上,你可以用支持动态类型的语言来实现这一点 - 但即使是大多数语言,sqrt
基本上都是静态类型的。如果您提供的输入是实数,则结果也将是实数,如果输入为负,则结果通常为NaN
或该订单上的某个内容。如果(并且仅当)您将输入作为复数提供,您将收到一个复数作为结果。