c++11模板元编程在编译时构造一个std::unorderer_map
c++11 template metaprogramming construct a std::unorderer_map at compile time
我试图用模板元编程技术开发有限状态机,但我遇到了必须在编译时填充的映射,这是代码(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 定义为在 class 中定义的 class 变量,由模板参数
表示
非常感谢任何帮助。
谢谢!!!!
我已经使用默认类型进行了测试,它可以编译并运行
错误信息很清楚。 TransitionPtr
是指针,不是类型,所以不能用在TransitionPtr::TransitionID_Value
中::
的左边。
此外,我认为您找不到在编译时初始化 unordered_set
的方法,因为它没有 constexpr
构造函数并且通常几乎肯定会使用堆分配.
我试图用模板元编程技术开发有限状态机,但我遇到了必须在编译时填充的映射,这是代码(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 定义为在 class 中定义的 class 变量,由模板参数
表示非常感谢任何帮助。 谢谢!!!!
我已经使用默认类型进行了测试,它可以编译并运行
错误信息很清楚。 TransitionPtr
是指针,不是类型,所以不能用在TransitionPtr::TransitionID_Value
中::
的左边。
此外,我认为您找不到在编译时初始化 unordered_set
的方法,因为它没有 constexpr
构造函数并且通常几乎肯定会使用堆分配.