【问题标题】:Return type based on value of input parameter基于输入参数值的返回类型
【发布时间】:2013-08-07 23:30:34
【问题描述】:

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

【问题讨论】:

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

标签: c++ c++11 decltype


【解决方案1】:

不,这是不可能的。

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

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

【讨论】:

    【解决方案2】:

    您可以返回 boost::variant&lt;double, std::complex&lt;double&gt;&gt;(因为必须在运行时做出决定),但这似乎给您的代码增加了很多复杂性,却没有真正的收获。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2019-10-29
        • 2021-11-10
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 2020-07-29
        相关资源
        最近更新 更多