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