|
Boost Users : |
Subject: [Boost-users] [msm] how to write a generic class for all state machine back-end.
From: Jerry Chen (jerryunsw_at_[hidden])
Date: 2011-06-22 19:55:10
In our project, we need a generic interface to refer to different state
machine (back-end). For example, in the following codes, we want to use
SMBase* to refer to any concrete state machine. SMBase should have similar
interface as state machine.
struct User {
A(SMBase* s) : sm(s) ();
SMBase* sm;
...
// User can use sm->start(), sm->process_event() etc
}
struct SMBase
{
virtual void start() = 0;
... // how to design the rest ???
}
// a wrapper implement SMBase
template < typename SM >
class SMWrapper : public SMBase{
SMWrapper(SM & s): sm(s){};
virtual void start() { sm.start(); }
...
SM sm;
}
main()
{
typedef boost::msm::back::state_machine SM1;
typedef boost::msm::back::state_machine SM2;
User a1(new SMWrapper(SM1()) ); // Wrap the concrete state machine and
pass it to User.
User a2(new SMWrapper(SM2()) ); // Pass a different state machine.
...
}
The problem of designing SMBase is the function "process_event". We want it
to to be virtual function so SMWrapper can implement it. But it also needs
to be a template according to state machine interface. But we cannot have a
virtual template function.
How can we achieve/design this generic state machine interface?
Many thanks.
Jerry
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net