Cela peut être un peu trop avancé, mais ici ...
boost::function et boost::bind peut être utilisé pour mettre en œuvre un programmateur qui n'a pas besoin de savoir quoi que ce soit au sujet de la classe A. Cela rendrait votre planificateur plus générique et réutilisable.
Voici quelques exemples de code qui illustre comment ces installations Boost peuvent être utilisés dans votre cas:
#include <ctime>
#include <queue>
#include <boost/function.hpp>
#include <boost/bind.hpp>
struct Foo
{
void onScheduler(time_t time) {/*...*/}
};
struct Bar
{
void onScheduler(time_t time) {/*...*/}
};
typedef boost::function<void (time_t)> SchedulerHandler;
struct SchedulerEvent
{
bool operator<(const SchedulerEvent& rhs) const {return when < rhs.when;}
SchedulerHandler handler;
time_t when;
};
class Scheduler
{
public:
void schedule(SchedulerHandler handler, time_t when)
{
SchedulerEvent event = {handler, when};
queue_.push(event);
}
private:
std::priority_queue<SchedulerEvent> queue_;
void onNextEvent()
{
const SchedulerEvent& next = queue_.top();
next.handler(next.when);
queue_.pop();
}
};
int main()
{
Scheduler s;
Foo f1, f2;
Bar b1, b2;
time_t now = time(0);
s.schedule(boost::bind(&Foo::onScheduler, &f1, _1), now + 1);
s.schedule(boost::bind(&Foo::onScheduler, &f2, _1), now + 2);
s.schedule(boost::bind(&Bar::onScheduler, &b1, _1), now + 3);
s.schedule(boost::bind(&Bar::onScheduler, &b2, _1), now + 4);
// Do scheduling...
return 0;
}
Notez que Scheduler
sait rien Foo
& Bar
, et vice-versa. Tous les Scheduler
veut vraiment un foncteur "callback" qui correspond à la signature spécifiée par SchedulerHandler
.
Si vous avez besoin d'un SchedulerEvent
pour être annulable, les choses deviennent un peu compliquées car les objets boost::function
ne sont pas comparables. Pour contourner cela, vous devrez retourner une sorte de jeton "connexion" lors de l'enregistrement des événements. C'est essentiellement ce que fait Boost.Signal.
Espérons que cela aide.