【问题标题】:Recursively call a function object递归调用函数对象
【发布时间】:2013-07-29 15:41:34
【问题描述】:

如何从自身内部调用函数对象?看来我不能使用this。示例:

class factorial {
  public:
  int operator()(int n) {
    if (n == 0)
      return 1;
    return n * ??(n-1);
  }
};

我在?? 放什么?

【问题讨论】:

  • (*this) 呢?
  • 另外,this->operator()(n-1);
  • @Borgleader:他遵循函子模式,它要求非static operator()()。添加诸如static之类的修饰符并不总是有价值的,因为您可以,对于这个特定函子的这个特定版本。
  • 根据评论添加了public:
  • 简短评论:在具有 32 位整数的系统上,您不能使用此实现来计算 14!因为14!大于 32 位可表示的最大数。在具有 64 位整数的系统上,22!尽可能大。

标签: c++ function-object


【解决方案1】:
#include <iostream>

class factorial {
public:
  int operator()(int n) {
    if (n == 0)
      return 1;
    return n * (*this)(n-1);
  }
};

int main()
{
    std::cout << factorial()(5) << std::endl;
}

对我来说很好用。 Live example.

【讨论】:

    【解决方案2】:

    您可以使用重载运算符的名称:

    operator()(n-1);
    

    或者调用当前对象的操作符:

    (*this)(n-1);
    

    【讨论】:

      【解决方案3】:

      正如DyP 提到的,您可以致电(*this)(n-1)。但是,读起来很奇怪,因此最好将其拆分为单独的 calculate_factoral 方法并调用它

      【讨论】:

      • 如果你想给*this起一个更好的名字,那么本地引用变量就足够了。例如factorial&amp; recurse = *this; return n * recurse(n-1); 你不能把它移到一个名为 factorial 的单独函数中,因为这会与构造函数发生命名冲突。
      • @Ben - 谢谢,我错过了这个类也被称为阶乘!
      【解决方案4】:

      正如一些人指出的那样,您可以只使用(*this)(n - 1) 语法。但是这种语法并不完全直观,更好的解决方案可能是将实际实现分解为另一个命名方法。

      class factorial { 
      public:
        int operator()(int n) {
          return impl(n);
        }
      private:
        int impl(int n) { 
          // actual work here 
        }
      };
      

      【讨论】:

        【解决方案5】:

        您可以使用显式运算符语法:

        class factorial {
          int operator()(int n) {
            if (n == 0)
              return 1;
            return n * operator()(n-1);
          }
        };
        

        或取消引用this

        class factorial {
          int operator()(int n) {
            if (n == 0)
              return 1;
            return n * (*this)(n-1);
          }
        };
        

        【讨论】:

          【解决方案6】:

          肯定是阶乘?

          我只知道Java,递归阶乘可以写成:

          public class Factorial{
          
              public int factorial(int n) {
                  return (n > 1) ? n * factorial(n-1) : 1;
              }
          }
          

          我假设同样的原则也适用。

          【讨论】:

          • 但是函数没有被调用factorial;这是operator() 的重载。
          • 不幸的是,知道 Java 并没有给你任何运算符重载的经验,这是这个问题的核心。
          • 对,写一个函数很简单;我在这里尝试函数对象/运算符重载。
          • 谢谢,之前没听说过运算符重载。
          猜你喜欢
          • 1970-01-01
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多