c++ - 一个函数可以返回一个指向它自己类型的指针吗?

标签 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_
};

每个状态都是一个返回状态的函数。但是我不知道如何声明一个函数,其返回类型包括它的返回类型。有没有办法打破递归?

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

最佳答案

如果我没理解错的话,你想返回一个函数引用到状态链中的下一个函数,并且所有状态步函数都具有相同的签名?

我看到这里的问题是返回类型是函数本身,所以声明函数的类型会调用递归类型定义。

因此,您想编写 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);
  }
};

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

关于c++ - 一个函数可以返回一个指向它自己类型的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575096/

相关文章:

C# 等价于 C++ 回调

c++ - 使用 sizeof() 计算数组大小

c++ - std::enable_shared_from_this::shared_from_this 如何工作

c++ - 成员变量指针的函数参数包

c++ - pthread_create 没有参数?

c++ - cout vector<vector<int>> 更简洁

c++ - 是否可以仅通过标识符检查成员模板的存在?

c++ - 编写函数来释放指针并将其分配为 NULL

c++ useless-cast from size_t to uint32_t for different targets

c++ - Visual Studio 2010 链接器查找多重定义的符号(在不应该的地方)