返回类型基于输入参数的值

时间:2013-08-07 15:06:55

标签: c++ c++11 decltype

在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));
    }
}

3 个答案:

答案 0 :(得分:5)

不,这是不可能的。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

这是不可能的,也许更重要的是,即使你能做到这一点也可能没用。

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

理论上,你可以用支持动态类型的语言来实现这一点 - 但即使是大多数语言,sqrt基本上都是静态类型的。如果您提供的输入是实数,则结果也将是实数,如果输入为负,则结果通常为NaN或该订单上的某个内容。如果(并且仅当)您将输入作为复数提供,您将收到一个复数作为结果。

相关问题