问题描述
我正在制作一个名为“ StateMachine”的类,以制作其他继承该逻辑的类。
试图使“状态”结构存储指向要在该状态下执行的函数的指针,我发现自己需要使用lambda函数。但是,如果没有“ scatic const”,我似乎无法在结构中声明汽车成员。
statemachine.h
#include <vector>
#include <string>
#include <map>
using namespace std;
struct State
{
string id;
auto action;
string next;
State():id(""){}
State(string _id,auto func,string n = ""):id(_id),action(func),next(n){}
};
class StateMachine
{
protected:
void addState(string id,auto func)
{
if(activeState == ""){activeState = id;}
stateList.insert(pair<string,State>(id,State(id,func)));
}
void doAction()
{
if(stateList[activeState].action != nullptr)
{
(*stateList[activeState].action)();
if(stateList[activeState].next != "")
{
activeState = stateList[activeState].next;
}
}
}
void setState(string state)
{
if(stateList.count(state) != 0)
{
activeState = state;
}
}
string getState()
{
return activeState;
}
private:
map<string,State> stateList;
string activeState = "";
};
使用示例
class Player : public StateMachine
{
public:
Player()
{
addState("ST_SPAWN",[this]{this->OnSpawn();});
}
virtual ~Player(){}
void OnSpawn()
{
//...
}
};
/home/yawin/Dokumentuak/Proyectos/C++/Dough/src/./include/interfaces/statemachine.h:34:10: error: non-static data member declared ‘auto’
auto action;
我该怎么办?
解决方法
您可以使用std::function
简化此操作。
#include <functional>
struct State {
string id;
std::function<void()> action;
string next;
State(){id = "";}
State(string _id,std::function<void()> func,string n = "") :
id(_id),action(func),next(n) {}
};
class StateMachine {
//...
void addState(string id,std::function<void()> func) {
if(activeState == "") activeState = id;
stateList.emplace(id,State{id,func});
}
//...