Итак, сначала я сделал разумное количество поисковых запросов, но все решения кажутся неоправданно сложными. Итак, я думал, что попрошу здесь посмотреть, действительно ли эта задача требует такого подхода, с которым я столкнулся ...Как реализовать простую очередь событий?
Итак, скажем, у меня есть класс Event
. Я бы хотел, чтобы у него была переменная time
и указатель функции/переменная/магическая функция functionToExecuteAtTime
, которая позволяет передавать любую старую функцию этому классу.
Также я хотел бы, чтобы события проводились в очереди приоритетов, которая упорядочивает события по порядку времени и выполняет функции, которые они «переносят». Но забыть об этом на текущий
Что-то вроде этого ...
class Agent
{
public:
int id;
float cash;
Agent::Agent
{
cash = 100;
}
}
class uberSystem
{
public:
float assets;
int supplyOfDeadlyPoison;
float poisonCost;
std::vector<Agent> agents;
uberSystem::uberSystem
{
assets = 100000;
supplyOfDeadlyPoison = 100000;
poisonCost = 8;
for(int i = 0; i < 100; i++)
{
Agent newAgent;
newAgent.id = i;
agents.push_back(newAgent)
}
}
};
class Event
{
public:
int time;
SOMETHING_THAT_LETS_ME_HOLD_FUNCTIONS myFunction;
Event::Event(int t, SOMETHING_THAT_LETS_ME_HOLD_FUNCTIONS func)
{
time = t;
myFunction = func;
}
}
int uselessFunction()
{
return 42;
}
void buyPoisonAndKillAgent(Agent &myAgent, uberSystem &mySystem)//obviously not good...
{
myAgent.cash -= mySystem.poisonCost;
mySystem.assets += mySystem.poisonCost;
mySystem.agents.erase(mySystem.agents.begin()+myAgent.id);
mySystem.supplyOfDeadlyPoison -= 1;
}
int main()
{
uberSystem newSystem;
// Event newEvent(100, uselessFunction());//make a new event
Event newEvent(100, buyPoisonAndKillAgent(newSystem.agents[5], newSystem));
newEvent.myFunction;//run the bloody function
return 0;
}
Хорошо, так что выглядит крайне желаемое за действительное теперь, когда я печатаю его. Итак, как я могу это достичь? Является ли указателем на функцию способом? Или есть какой-то лучший способ, который мне так или иначе удалось найти?
О, и, видимо, у меня есть std::function
, доступный в конце концов ... Я не был в каменном веке!
Спасибо!
Как насчет [std :: deque>] (http://en.cppreference.com/w/cpp/container/deque)? –
std :: function может это сделать, я предлагаю вам избежать указателей на функции. :) – Melkon
Является ли «время» в реальном времени или моделируется? Или он просто используется для заказа событий? – MatthiasB