函数可以返回指向自己类型的指针吗?

Jac*_*eth 5 c++ c++11 c++14 c++17

我在一个类中实现了一个非常小的有限状态机,我最初的方法是尝试这个:

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_
};
Run Code Online (Sandbox Code Playgroud)

每个状态都是一个返回状态的函数.但我无法弄清楚如何声明一个返回类型包含其返回类型的函数.有没有办法打破递归?

相反,我使用了enum class一个丑陋的switch陈述.

Gem*_*lor 6

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

我发现这里的问题是返回类型是函数本身,因此声明函数的类型会调用递归类型定义。

因此,您想要编写以下形式的函数RetType fn_(float),但 RetType 的类型(基本上)是RetType fn_(float)。所以现在我们有了(RetType (*)(float)) fn_(float)类似的东西,但是无论我们如何努力,我们都无法摆脱 RetType。

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

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);
  }
};
Run Code Online (Sandbox Code Playgroud)

所以现在递归定义被打破了,我们的状态函数可以返回 StateFn 对象,并且我们可以调用它们。