#pragma once #include namespace td { template class StateMachine { public: class State { public: State(TDerived& a_StateMachine) : m_StateMachine(a_StateMachine) {} virtual ~State() {} virtual TReturn Update(TArgs... args) = 0; protected: TDerived& m_StateMachine; }; StateMachine() {} virtual ~StateMachine() {} TReturn Update(TArgs... args) { assert(m_State); return m_State->Update(args...); } template void ChangeState(Args&&... args) { m_State = std::make_unique(static_cast(*this), args...); } private: std::unique_ptr m_State; }; } // namespace td