【问题标题】:c++11 template metaprogramming construct a std::unorderer_map at compile timec++11模板元编程在编译时构造一个std::unorderer_map
【发布时间】:2015-08-14 21:10:11
【问题描述】:

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

    #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 定义为在模板参数表示的类中定义的类变量

我将非常感谢任何帮助。 谢谢!!!!

我已经用默认类型进行了测试,它可以编译并工作

【问题讨论】:

    标签: c++11 template-meta-programming state-machine


    【解决方案1】:

    错误信息很清楚。 TransitionPtr 是指针,不是类型,所以在TransitionPtr::TransitionID_Value 中不能在:: 的左边使用。

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

    【讨论】:

      猜你喜欢
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      相关资源
      最近更新 更多