2015-08-14 160 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构造函数,并且通常几乎肯定会使用堆分配。