函数可以将指针返回其自己的类型

Can a function return a pointer to its own type?

本文关键字:自己的 类型 返回 指针 函数      更新时间:2023-10-16

我已经在类中实现了一台非常最小的有限状态机,我的原始方法是尝试以下方法:

class Widget {
public:
  void update(float time_interval){
    current_state = current_state_(time_interval);
  }
private:
  std::function<  ??  > off_(float);
  std::function<  ??  > standby_(float);
  std::function<  ??  > locked_(float);
  std::function<  ??  > current_state_; // initialised to off_
};

每个状态是返回状态的函数。但是我无法确定如何声明返回类型包含其返回类型的函数。有没有办法打破递归?

相反,我使用了enum class和丑陋的switch语句。

如果我正确理解,则要返回状态链中的下一个函数,并且所有状态步骤函数都具有相同的签名?

我在这里看到问题是返回类型是函数本身,因此声明该函数的类型调用递归类型的定义。

因此,您要编写表单RetType fn_(float)的功能,但是RetType的类型是(基本上(RetType fn_(float)。因此,现在我们有了(RetType (*)(float)) fn_(float)或类似的东西,但是无论多么艰难,我们都无法摆脱rettype。

如果不向前宣布某些内容,您就无法关闭该递归。我们可以转发声明类并使用它们,因此让我们为您的功能指针编写一个简单的类包装器,这也许是@Jarod所指的。现在,std ::函数是您功能的类包装器,但是它需要明确的类型声明,我们没有。

class Widget;
class StateFn;
class StateFn
{
  Widget * THIS;
  StateFn (Widget::*Fn)(float);
public:
  /// Or you could rely on POD construction
  StateFn(Widget * THIS, StateFn (Widget::*Fn)(float))
  : THIS(THIS), Fn(Fn)
  {}
  StateFn operator()(float f)
  {
    return THIS->*fn(f);
  }
};

因此,现在递归定义被打破,我们的状态函数可以返回状态FN对象,我们可以致电它们。

我找到了一个解决方案 - 使用 std::unordered_map替代丑陋的 switch

class Widget {
public:
  enum class State { Off, Standby, Locked };
  void update(float time_interval) {
    current_state_ = (this->*state_fn_.at(state_))(time_interval);
  }
private:
  State off_(float) {return ::has_power() ? State::Standby : State::Off;}
  State standby_(float);
  State locked_(float);
  const std::unordered_map<State, State(Widget::*)(float)> state_fn_{
      {State::Off,     &Widget::off_},
      {State::Standby, &Widget::standby_},
      {State::Locked,  &Widget::locked_}};
  State current_state_{State::Off};
};

只有1 3n行的代码比我在问题中提出的理想代码差 - 我对此非常满意!