【问题标题】:Function Type which Returns Itself [duplicate]返回自身的函数类型[重复]
【发布时间】:2016-02-28 01:23:58
【问题描述】:

我正在尝试用 C++ 编写一个非常小的状态机。我希望这些状态成为机器类的方法,并且每个状态在运行时都应该返回要移动到的新状态。当然,我正在使用一些 typedef 来提供帮助。

template <typename C, typename E>
using State = State<C, E> (C::*)(Stream<E>&);

状态应该是一个成员函数(在C 类中),它接受一个流对象并产生一个新状态。我收到以下错误。

fsm.hpp:8:15: error: ‘State’ does not name a type
 using State = State<C, E> (C::*)(Stream<E>&);

显然,State 尚未在应该声明 State 的行上声明。据我所知,没有办法“转发声明”一个 typedef,那么声明这个 typename 的合适方法是什么?

【问题讨论】:

  • State 只对应函数(well, method)类型。状态机本身是C 类型,是State 的一个参数。我不需要每个州都有单独的类实例;我只需要函数。
  • 澄清一下,我希望State&lt;C, E&gt; 是一个方法,它接受一个参数,然后返回一个新的State&lt;C, E&gt;,它本身是一个方法,而不是一个类实例。
  • 我明白了,我想我看错了你的代码。
  • 你能发一个MCVE吗?从您发布的内容来看,您似乎有一个名为 State 的类模板,并且您正在尝试定义一个别名也名为 State
  • @Praetorian:我一开始也是这么想的,但我认为这实际上并不是怎么回事,他希望State&lt;C,E&gt; 引用当前定义的别名类型。

标签: c++ c++11 types self-reference


【解决方案1】:

我不确定我是否可以解释为什么您尝试的方法不起作用 - 我不知道 using 声明是否允许自引用,也许它们是不。

但是,当然,在类模板中,当前正在定义的类的名称被注入到类作用域中,所以你可以这样做。

在这个版本中,我创建了一个类类型,它是成员函数指针的瘦包装器。我相信优化器应该基本上消除它这个包装器,但它可以让你做你想做的事,通过利用注入的类名。

这在 gcc 5.2.0 中编译和运行

template <typename T>
struct Stream {};

template <typename C, typename E>
class State {
  typedef State (C::*func_t)(Stream<E>&);

  func_t f_;

public:
  State(func_t _f) : f_(_f) {}

  State operator()(C & c, Stream<E> & s) const {
    return (c.*f_)(s);
  }
};





struct Foo {
  State<Foo, int> state_one(Stream<int> &) { return &Foo::state_two; } 
  State<Foo, int> state_two(Stream<int> &) { return &Foo::state_one; } 
};

int main() {
  Foo f;
  Stream<int> s;
  f.state_one(s);
}

【讨论】:

  • 这或多或少是我最终做的。重复问题中的一个答案与此类似。
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 2014-09-06
相关资源
最近更新 更多