- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 boost::msm 实现子子状态机时遇到了一些麻烦。我试图在这里最小化我的代码...
测试.cpp:
struct SM_ : StateMachineA<SM_> {};
// Pick a back-end
typedef boost::msm::back::state_machine<SM_> SM;
int main()
{
std::cout << "Starting State Machine" << std::endl;
SM sm1;
// sm1.start();
return 0;
}
StateMachineA在StateMachineA.h中定义
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
template<typename Derived>
struct StateMachineA: protected msmf::state_machine_def < Derived, msmf::default_base_state >
{
public:
//// Entry point to state machine.
//// Set initial state
typedef mpl::vector<initState, allOk> initial_state;
//// Exit Point
struct Exit :msmf::terminate_state<> {};
// ----- Sub State machine
struct SSM_ : StateMachineB<SSM_> {};
// Pick a back-end
typedef boost::msm::back::state_machine<SSM_> stateMachineB;
//// Transition table
struct transition_table : mpl::vector<
msmf::Row < initState, go, stateMachineB, msmf::none, msmf::none >,
msmf::Row < allOk, fatalThrown, Exit, msmf::none, msmf::none >,
msmf::Row < error, fatalThrown, Exit, msmf::none, msmf::none >
> {};
protected:
template <class FSM, class Event>
void no_transition(Event const&, FSM&, int)
{
std::cout << "ERROR: Unallowed transition detected" << std::endl;
}
};
StateMachineB 包含一个 StateMachineC,使用完全相同的代码(用 C 替换 B...)。
将 StateMachineC 作为 StateMachineA 的子机(省略 StateMachineB)工作正常。对于不包括 C 的 A -> B 也同样有效。重新排序状态机 (A -> C -> B) 会产生相同的错误。总结一下:两个状态机的每个组合都在工作,三个状态机的每个组合都在失败。当我的主函数中有 SM sm1;
时会发生错误。 -> 在解析模板时?没有那一行,一切都可以正常编译。
错误日志很长(长到足以导致 visual studio 在悬停时崩溃...)。第一个错误是:
D:\boost_1_59_0\boost/mpl/aux_/push_front_impl.hpp(45) : error C2664: 'int boost::mpl::assertion_failed<false>(boost::mpl::assert<false>::type)' : cannot convert argument 1 from 'boost::mpl::failed ************(__thiscall boost::mpl::push_front_impl<boost::mpl::aux::vector_tag<20>>::apply<Sequence,T>::REQUESTED_PUSH_FRONT_SPECIALIZATION_FOR_SEQUENCE_DOES_NOT_EXIST::* ***********)(Sequence)' to 'boost::mpl::assert<false>::type'
与... 以及大约 200 条“with”行。之后,出现许多类型的错误:
D:\boost_1_59_0\boost/mpl/aux_/insert_impl.hpp(60) : error C3203: 'type' : unspecialized class template can't be used as a template argument for template parameter 'State', expected a real type
D:\boost_1_59_0\boost/mpl/insert.hpp(32) : error C2903: 'apply' : symbol is neither a class template nor a function template
D:\boost_1_59_0\boost/mpl/aux_/has_type.hpp(20) : see reference to class template instantiation 'boost::mpl::insert<U1,U2,U3>' being compiled
关注。
有什么想法吗?
谢谢!
最佳答案
我无法重现您的情况,但我可以向您展示如何实现 SubSub 状态机。这是我写的文档。它描述了子状态机。 http://redboltz.wikidot.com/sub-machine-state
要实现 SubSub 状态机,只需应用两次子机实现即可。
这是包含 SubSub 状态机的代码:
#include <iostream>
#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/front/functor_row.hpp>
#include <boost/static_assert.hpp>
namespace msm = boost::msm;
namespace msmf = boost::msm::front;
namespace mpl = boost::mpl;
// StateMachine [Osm]
//
// (initial)
// |
// V
// State1:StateSub --Event1--> State2
//
//
// StateMachine [StateSub]
//
// (initial)
// |
// V
// SubState1 --Event2--> SubState2:StateSubSub
// A |
// +--------Event3------------+
//
//
// StateMachine [StateSubSub]
//
// (initial)
// |
// V
// SubSubState1---Event4--> SubSubState2
// A |
// +-----------Event5---------+
// ----- Events
struct Event1 {};
struct Event2 {};
struct Event3 {};
struct Event4 {};
struct Event5 {};
// ----- State machine
struct StateSubSub_:msmf::state_machine_def<StateSubSub_>
{
struct SubSubState1:msmf::state<> {
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSubSub_>::value));
std::cout << "SubSubState1::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSubSub_>::value));
std::cout << "SubSubState1::on_exit()" << std::endl;
}
};
struct SubSubState2:msmf::state<> {
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSubSub_>::value));
std::cout << "SubSubState2::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSubSub_>::value));
std::cout << "SubSubState2::on_exit()" << std::endl;
}
};
// Set initial state
typedef mpl::vector<SubSubState1> initial_state;
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < SubSubState1, Event4, SubSubState2, msmf::none, msmf::none >,
msmf::Row < SubSubState2, Event5, SubSubState1, msmf::none, msmf::none >
> {};
};
typedef msm::back::state_machine<StateSubSub_> StateSubSub;
// ----- State machine
struct StateSub_:msmf::state_machine_def<StateSub_>
{
struct SubState1:msmf::state<> {
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSub_>::value));
std::cout << "SubState1::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSub_>::value));
std::cout << "SubState1::on_exit()" << std::endl;
}
};
struct SubState2_:msmf::state_machine_def<SubState2_>
{
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSub_>::value));
std::cout << "SubState2::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, StateSub_>::value));
std::cout << "SubState2::on_exit()" << std::endl;
}
struct Impl_:StateSubSub {};
typedef Impl_ initial_state;
};
// Pick a back-end
typedef msm::back::state_machine<SubState2_> SubState2;
// Set initial state
typedef mpl::vector<SubState1> initial_state;
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < SubState1, Event2, SubState2, msmf::none, msmf::none >,
msmf::Row < SubState2, Event3, SubState1, msmf::none, msmf::none >
> {};
};
typedef msm::back::state_machine<StateSub_> StateSub;
struct OuterSm_:msmf::state_machine_def<OuterSm_>
{
struct State1_:msmf::state_machine_def<State1_>
{
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, OuterSm_>::value));
std::cout << "State1::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, OuterSm_>::value));
std::cout << "State1::on_exit()" << std::endl;
}
struct Impl_:StateSub {};
typedef Impl_ initial_state;
};
// Pick a back-end
typedef msm::back::state_machine<State1_> State1;
struct State2:msmf::state<>
{
template <class Event,class Fsm>
void on_entry(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, OuterSm_>::value));
std::cout << "State2::on_entry()" << std::endl;
}
template <class Event,class Fsm>
void on_exit(Event const&, Fsm&) const {
BOOST_STATIC_ASSERT((boost::is_convertible<Fsm, OuterSm_>::value));
std::cout << "State2::on_exit()" << std::endl;
}
};
// Set initial state
typedef State1 initial_state;
// Transition table
struct transition_table:mpl::vector<
// Start Event Next Action Guard
msmf::Row < State1, Event1, State2, msmf::none, msmf::none >
> {};
};
// Pick a back-end
typedef msm::back::state_machine<OuterSm_> Osm;
void test()
{
Osm osm;
osm.start();
std::cout << "> Send Event2()" << std::endl;
osm.process_event(Event2());
std::cout << "> Send Event4()" << std::endl;
osm.process_event(Event4());
std::cout << "> Send Event5()" << std::endl;
osm.process_event(Event5());
std::cout << "> Send Event3()" << std::endl;
osm.process_event(Event3());
std::cout << "> Send Event1()" << std::endl;
osm.process_event(Event1());
}
int main()
{
test();
}
您可以在在线编译器Wandbox上编译、运行和修改它。
关于c++ - Boost msm 子子状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35559179/
假设我有 2 个状态,一个事件状态和一个空闲状态。如果我在 Active 状态下收到一些事件,我想推迟它们并在我返回 Idle 状态时执行它们。 但是当我回到空闲状态时,有没有办法选择要处理哪个先前延
我有一个像这样的状态机: class FsmDef : public boost::msm::front::state_machine_def { private: Args args;
我是 boost 元状态库的新手。我正在构建一个应用程序,我必须在其中使用 msm。 我的应用程序有两个线程,它们使用相同的 msm 对象作为共享资源。如果两个线程都在同一个 msm 对象上调用 pr
我有一个实时循环,我需要根据我所处的状态进行每次迭代的工作。 我正在使用 Boosts Meta State Machine 库来实现我的状态机。根据我所处的状态调用函数的最佳方法是什么? 假设我有一
我想知道是否有一种方法可以直接安装msm而不需要创建另一个安装项目? 最佳答案 这是不可能的。 MSM 包的目的是共享资源,例如 VC++ 可再发行组件,您可以将其包含在应用程序的安装程序中,例如先决
我有一个更大的站点,它使用 MSM 分成子域。这些站点中的每一个都有自己的一组员工来管理该部分。我的想法是创建成员组来反射(reflect)这些员工组,并为他们分配对每个子域的适当访问权限。每个子域都
我尝试使用 boost::MSM 实现一个简单的状态机以进行测试。有几个事件必须按正确的顺序处理,所以我推迟了目前不允许的其他事件。我尝试推迟转换表中的事件,以便在一个地方寻找它,尽管要查看所有状态,
在 boost::msm 的文档中有一个 example没有默认构造函数的状态机。我可以让它在我直接从 super SM 跳到子 SM 的地方工作。但是当我从一个子 SM 跳转到另一个子 SM 时,目
我的问题更像是一个架构问题。我有多个相同类型的状态机。说 controller_type1_sm controller1; controller_type2_sm controller2; std::
我有一个通用的保护条件,我想在某些情况下有条件地阻止转换。下面是我想做的一些 C++/伪代码。 bool operator()(Event const& evt, FSM & fsm, SourceS
我在使用 boost::msm 实现子子状态机时遇到了一些麻烦。我试图在这里最小化我的代码... 测试.cpp: struct SM_ : StateMachineA {}; // Pick a ba
以下代码是仿函数前端的 boost msm 文档中给出的示例。 #include #include // back-end #include //front-end #include //
网络上的任何地方似乎都没有关于如何执行此操作的分步过程记录。如果提到它,它的文档记录很差,我无法遵循他们建议的复杂路径。我是 ClickOnce 的新手,我已经能够让我的 c# 程序在用户机器上正确安
我想使用 boost msm 状态机,但我很难想象它是如何工作的。假设我们只有 2 个状态(s1,s2),要从 s1 到 s2,您需要触发事件 e1 并返回,您需要另一个 e2。e1 和 e2 只能分
我正在使用新的 Boost 1.44.0 MSM 库来生成状态机。在此状态机中,有两类事件 class1 和 class2。 class1 事件可以由状态 S1 或 S2 处理,而 class2 事件
当我触发 process_event("eventname") 时,如何检查状态转换是否发生或是否调用了 no_transition? 基本上,我希望触发/调用 process_event("even
我使用 MSM 插件在两个不同的域名上运行两个 ExpressionEngine 站点。站点一包含所有系统文件等,站点二位于站点一的子文件夹中。我的问题是如何让站点 2 在 url 中没有它的 ind
我正在使用 Windows Installer XML (WiX) 工具集创建发行版。我想将 Visual C++ Redistributable 添加到包中。这里 http://wix.source
我正在熟悉 MSM boost 库。我发现这真的很有趣 questions关于加入几个正交状态。 此外,我在 boost 文档中找到了一种在父状态机中重用子状态机的方法,并且我编写了几个简单的嵌套状态
我正在使用 Boost MSM 来模拟机器人的行为。有多种状态,如“ManualMove”、“AutoMove”、“Work”、“Idle”等……但是,我需要能够从任何状态强行停止机器人,将其置于无法
我是一名优秀的程序员,十分优秀!