Aquí hay un ejemplo de nuestra base de código. Se ha simplificado, por lo que no garantizo que compilará, pero debería estar cerca. La sublocación es su clase A, y Slot1 es su clase B. Tenemos un número de espacios como este, cada uno de los cuales se suscribe a un subconjunto diferente de señales. Las ventajas de utilizar este esquema son que Sublocation no sabe nada de ninguno de los slots, y los slots no necesitan formar parte de ninguna jerarquía de herencia, y solo necesitan implementar funcionalidades para los slots que les interesan. Usamos esto para agregar funcionalidad personalizada a nuestro sistema con una interfaz muy simple.
Sublocation.h
class Sublocation
{
public:
typedef boost::signal<void (Time, Time)> ContactSignal;
typedef boost::signal<void()> EndOfSimSignal;
void endOfSim();
void addPerson(Time t, Interactor::Ptr i);
Connection addSignalContact(const ContactSignal::slot_type& slot) const;
Connection addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const;
private:
mutable ContactSignal fSigContact;
mutable EndOfSimSignal fSigEndOfSim;
};
Sublocation.C
void Sublocation::endOfSim()
{
fSigEndOfSim();
}
Sublocation::Connection Sublocation::addSignalContact(const ContactSignal::slot_type& slot) const
{
return fSigContact.connect(slot);
}
Sublocation::Connection Sublocation::addSignalEndOfSim(const EndOfSimSignal::slot_type& slot) const
{
return fSigEndOfSim.connect(slot);
}
Sublocation::Sublocation()
{
Slot1* slot1 = new Slot1(*this);
Slot2* slot2 = new Slot2(*this);
}
void Sublocation::addPerson(Time t, Interactor::Ptr i)
{
// compute t1
fSigOnContact(t, t1);
// ...
}
Slot1.h
class Slot1
{
public:
Slot1(const Sublocation& subloc);
void onContact(Time t1, Time t2);
void onEndOfSim();
private:
const Sublocation& fSubloc;
};
Slot1.C
Slot1::Slot1(const Sublocation& subloc)
: fSubloc(subloc)
{
subloc.addSignalContact(boost::bind(&Slot1::onContact, this, _1, _2));
subloc.addSignalEndSim(boost::bind(&Slot1::onEndSim, this));
}
void Slot1::onEndOfSim()
{
// ...
}
void Slot1::onContact(Time lastUpdate, Time t)
{
// ...
}
¿Es posible sobrecargar una función y, de ser así, le importaría agregar eso? S t. tienes algo como PrintNum (int); y PrintNum (flotante); – pyInTheSky
@pyInTheSky Use un tipo de función (no estoy seguro del término exacto): '(void (*) (int)) & PrintNum' – Qix