2016-02-28 37 views
0

功能类型我想用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的适当方式是什么?

+0

'State'仅对应于功能(当然,方法)型。状态机本身是'C'类型,是'State'的一个参数。我不需要每个州的单独的类实例;我只需要这些功能。 –

+0

为了澄清,我想'国'要接收一个参数,然后返回一个新的'国',这本身就是一种方法,而不是一个类实例的方法。 –

+0

我明白了,我想我误解了你的代码。 –

回答

2

我不确定我能否解释为什么你试过的东西没有用 - 我不知道是否允许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); 
} 
+0

这或多或少是我最终做的。重复问题中的一个答案与此类似。 –