C++11 c++;11模板元编程在编译时构造std::unorderer\u映射

C++11 c++;11模板元编程在编译时构造std::unorderer\u映射,c++11,template-meta-programming,state-machine,C++11,Template Meta Programming,State Machine,我试图用模板元编程技术开发一个有限状态机,但我遇到了一个必须在编译时填充的映射,这是代码(gcc 4.8 c++11): #包括 #包括 #包括 #包括 名称空间NSStateMachine{ //埃斯塔多大学定义 模板 结构转换 { 使用FSM_类型=FSM; 使用FROM_STATE=FROM; 使用事件类型=事件; 使用TO_STATE_TYPE=TO; 使用事件\基本\类型=类型名称事件::基本\类型; 静态bool do_转换(FSM_类型和电流状态、事件_基础_类型常量和aEvent

我试图用模板元编程技术开发一个有限状态机,但我遇到了一个必须在编译时填充的映射,这是代码(gcc 4.8 c++11):

#包括
#包括
#包括
#包括
名称空间NSStateMachine{
//埃斯塔多大学定义
模板
结构转换
{
使用FSM_类型=FSM;
使用FROM_STATE=FROM;
使用事件类型=事件;
使用TO_STATE_TYPE=TO;
使用事件\基本\类型=类型名称事件::基本\类型;
静态bool do_转换(FSM_类型和电流状态、事件_基础_类型常量和aEvent)
{
返回(当前状态。*传输(静态转换(aEvent));
}
};
//州
模板
类状态机
{
公众:
StateMachine():transitionMap{{static_cast(*TransitionPtr::TransitionID_Value),nullptr}
{}
模板
bool evalEvent(const Event&aEvent)
{

std::cout错误消息非常清楚。
TransitionPtr
是指针,而不是类型,因此您不能在
TransitionPtr::TransitionID\u值中的
左侧使用它

此外,我认为您不会找到在编译时初始化
无序集的方法,因为它没有
constexpr
构造函数,而且通常几乎肯定会使用堆分配

    #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}}