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

C++ 基于输入参数值的返回类型,c++,c++11,decltype,C++,C++11,Decltype,在C++11中,有没有一种方法可以实现同时适用于正负double输入值的sqrt函数?如果输入为负,我希望返回类型为std::complex,如果输入为正,则返回类型为double。我意识到简单的解决方案是总是返回std::complex,但这不是我想要的 下面是我第一次尝试的示例,但是由于返回类型中存在a,因此无法编译: inline decltype((a > 0)?(double):(std::complex<double>)) sqrt(const double&

在C++11中,有没有一种方法可以实现同时适用于正负
double
输入值的
sqrt
函数?如果输入为负,我希望返回类型为
std::complex
,如果输入为正,则返回类型为
double
。我意识到简单的解决方案是总是返回
std::complex
,但这不是我想要的

下面是我第一次尝试的示例,但是由于返回类型中存在
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));
    }
}
inlinedecltype((a>0)?(double):(std::complex))sqrt(constdouble&a)
{
如果(a>0)
{
返回标准::sqrt(a);
}
其他的
{
返回((std::complex(0.0,1.0))*std::sqrt(-a));
}
}

不,这是不可能的。

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


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

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

这是不可能的,而且可能更重要的是,即使您可以这样做,可能也没有用处

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


理论上,您可以在支持动态类型的语言中实现这一点,但即使使用大多数动态类型,
sqrt
基本上是静态类型的。如果您提供的输入是实数,则结果也将是实数,如果输入为负数,则结果通常是
NaN
或类似顺序的结果。如果(且仅当)您以复数形式提供输入,您将收到一个复数作为结果。

此外,我在命名空间中有此函数以避免与
std
冲突。将其声明为
inline auto sqrt(const double&a)->decltype((a>0)-(double):(std::complex))
应该可以工作。@pwny,否,不应该。类型是编译时,函数参数是运行时。看到问题了吗?@user814628:使用模板专门化在这里没有帮助。您仍然需要尝试根据直到运行时才知道的值推断类型(发生在编译时)。