2

在 C++11 中,有没有办法实现一个sqrt适用于正输入值和负double输入值的函数?我希望返回类型为std::complex<double>输入是否为负,double如果为正则为 a。我意识到简单的解决方案是总是返回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));
    }
}
4

3 回答 3

5

不,这是不可能的。

类型是编译时构造,您的函数类型在编译时是固定的。

如果参数作为constexpr“常量表达式”提供,那么您可能已经使用模板来解决您的问题。但是,对于动态输入,这根本不可能。

于 2013-08-07T15:16:52.297 回答
2

这是不可能的,而且可能更重要的是,即使你能做到,也可能没有用。

由于该函数可以返回一个复数,因此需要准备调用代码来处理一个复数。如果您的代码在任何情况下都需要能够处理复数,几乎可以肯定总是返回一个复数更有意义,如果输入为正,它将采用以下形式X + 0i(即,虚部等于 0 )。

理论上,您可以使用支持动态类型的语言来执行此操作——但即使使用其中的大多数,sqrt基本上也是静态类型的。如果您提供的输入是实数,则结果也将是实数,如果输入为负数,则结果通常是NaN该订单上的 a 或某物。如果(且仅当)您将输入作为复数提供,您将收到一个复数作为结果。

于 2013-08-07T15:30:34.463 回答
2

您可以返回 a boost::variant<double, std::complex<double>>(因为必须在运行时做出决定),但这似乎为您的代码增加了很多复杂性而没有真正的收益。

于 2013-08-07T15:20:38.657 回答