2015-08-14 163 views
0

我試圖用模板元編程技術開發一個有限狀態機,但是我得到一個必須在編譯時填充的映射,這個代碼(GCC 4.8 C++ 11):C++ 11模板元編程在編譯時構造一個std :: unorderer_map

#include <functional> 
    #include <type_traits> 
    #include <iostream> 
    #include <unordered_map> 
    namespace NSStateMachine { 
    //Definicion de estado unidad 

    template<class FSM, class From, class Event, class TO, bool(FSM::* transicion_fn)(const Event &)> 
    struct Transition 
    { 
     using FSM_TYPE=FSM; 
     using FROM_STATE= From; 
     using EVENT_TYPE= Event; 
     using TO_STATE_TYPE=TO; 
     using EVENT_BASE_TYPE = typename Event::BASE_TYPE; 

     static bool do_transition(FSM_TYPE& currenState, EVENT_BASE_TYPE const& aEvent) 
     { 
      return (currenState.*transicion_fn)(static_cast<EVENT_TYPE const&>(aEvent)); 
     } 
    }; 

    //States 
    template<class Transition, const Transition * const TransitionPtr, class ... Args> 
    class StateMachine 
    { 
     public: 
     StateMachine():transitionMap{{static_cast<typename Transition::TransitionID>(*TransitionPtr::TransitionID_Value),nullptr}} 
     {} 
     template<class Event> 
     bool evalEvent(const Event & aEvent) 
     { 
      std::cout<<"evento recibido"<<std::endl; 
     } 

     std::unordered_map<typename Transition::TransitionID, const Transition * const > transitionMap ; 

    }; 
    } 
int main() 
{ 
//it doesnt compile, i canoot create the state machine 
return 0; 
} 

編譯錯誤:

error: 'TransitionPtr' is not a class, namespace, or enumeration 
      StateMachine():transitionMap{{static_cast<typename Transition::TransitionID>(*TransitionPtr::TransitionID_Value),nullptr}} 


                    ^

的問題似乎是在線路

transitionMap{{static_cast<typename Transition::TransitionID>(*TransitionPtr::TransitionID_Value),nullptr}} 

我會嘗試用自動構造函數初始化unorderer_map。 我已經將此Transition :: TransitionID定義爲由模板參數表示的類中定義的類變量

我非常感謝任何幫助。 Thx !!!!

我已經默認類型的測試,它編譯並運行此

回答

2

錯誤消息是相當清楚的。 TransitionPtr是一個指針,不是一個類型,所以你不能用它在的左邊TransitionPtr::TransitionID_Value

另外,我不認爲你會在編譯時找到初始化unordered_set的方法,因爲它沒有constexpr構造函數,並且通常幾乎肯定會使用堆分配。