2016-02-28 39 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

這或多或少是我最終做的。重複問題中的一個答案與此類似。 –