I am reading about implementation of state machines using variants. I try to create a construction that take a variant parameter to initialize the state. However whent the constructor is defined , I get a warning that this is recognized as function declaration.
Moreover when I try to define a setter for the state, compiler error is generated when try to call this
Here is the code
#include "pch.h"
#include <iostream>
#include <variant>
#include <cassert>
struct DoorState
{
struct DoorOpened {};
struct DoorClosed {};
struct DoorLocked {};
using State = std::variant<DoorOpened, DoorClosed, DoorLocked>;
DoorState()
{
}
DoorState(State & state)
{
m_state = state;
}
void open()
{
m_state = std::visit(OpenEvent{}, m_state);
}
void close()
{
m_state = std::visit(CloseEvent{}, m_state);
}
void lock()
{
m_state = std::visit(LockEvent{}, m_state);
}
void unlock()
{
m_state = std::visit(UnlockEvent{}, m_state);
}
struct OpenEvent
{
State operator()(const DoorOpened&) { return DoorOpened(); }
State operator()(const DoorClosed&) { return DoorOpened(); }
// cannot open locked doors
State operator()(const DoorLocked&) { return DoorLocked(); }
};
struct CloseEvent
{
State operator()(const DoorOpened&) { return DoorClosed(); }
State operator()(const DoorClosed&) { return DoorClosed(); }
State operator()(const DoorLocked&) { return DoorLocked(); }
};
struct LockEvent
{
// cannot lock opened doors
State operator()(const DoorOpened&)
{
std::cout << "DoorOpened" << std::endl;
return DoorOpened();
}
State operator()(const DoorClosed&) { return DoorLocked(); }
State operator()(const DoorLocked&) { return DoorLocked(); }
};
struct UnlockEvent
{
// cannot unlock opened doors
State operator()(const DoorOpened&) { return DoorOpened(); }
State operator()(const DoorClosed&) { return DoorClosed(); }
// unlock
State operator()(const DoorLocked&) { return DoorClosed(); }
};
void set(State state)
{
}
State m_state;
};
int main()
{
//DoorState s(DoorState::DoorOpened);
DoorState s;
s.set(DoorState::DoorOpened);
s.lock();
return 0;
}