From https://boost-ext.github.io/sml/examples.html#deferprocess
Modified to try and copy the fsm.
#include <boost/sml.hpp> #include <cassert> #include <deque> #include <queue> namespace sml = boost::sml; namespace { struct e1 {}; struct e2 {}; struct e3 {}; struct e4 {}; struct defer_and_process { auto operator()() const noexcept { using namespace sml; return make_transition_table( *"idle"_s + event<e1> / defer , "idle"_s + event<e2> = "s1"_s , "s1"_s + event<e1> / process(e2{}) = "s2"_s , "s2"_s + event<e3> / process(e4{}) , "s2"_s + event<e4> = X ); } }; } // namespace int main() { using namespace sml; boost::sml::sm<defer_and_process, sml::defer_queue<std::deque>, sml::process_queue<std::queue>> sm; /// defer_queue policy to enable deferred events using std::queue boost::sml::sm<defer_and_process, sml::defer_queue<std::deque>, sml::process_queue<std::queue>> secondSm; sm = secondSm; } Copies fine without policies. Is there a trick to it?
If not, then how can the fsm ever be put into a class, seeing how it's a c++ library? Pointers? But those are on the heap.
unique_ptr<SM>to make it movable orshared_ptr<SM>to make it copyable. Of course, none of that make the SM actually copy. I'd refer to the library devs to find out about whether that's by design