2013-08-07 51 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或该订单上的某些内容。如果(且仅当)您将输入提供为复数时,您会收到一个复数。