Se fossi in te, non userei i puntatori di funzione per portare a termine questo compito. Lascia questa opzione ai guru;)
In Boost, c'è una bella biblioteca chiamata signals. Ti semplifica la vita! Questo è un esempio di utilizzo:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/signal.hpp>
using namespace std;
using namespace boost;
struct A
{ void A_action() { cout << "A::A_action();" << endl; } };
struct B
{ void B_action() { cout << "B::B_action();" << endl; } };
struct C
{ void C_action() { cout << "C::C_action();" << endl; } };
struct X
{
// Put all the functions you want to notify!
signal<void()> list_of_actions;
void do_something()
{
std::cout << "Hello I am X!" << endl;
list_of_actions(); // send notifications to all functions in the list!
}
};
int main()
{
X x;
A a;
B b;
C c;
x.list_of_actions.connect(bind(&A::A_action, a));
x.list_of_actions.connect(bind(&B::B_action, b));
x.list_of_actions.connect(bind(&C::C_action, c));
x.do_something();
}
questo stampa:
Hello I am X!
A::A_action();
B::B_action();
C::C_action();
Ecco come funziona.
In primo luogo, si dichiara il luogo che contiene i delegati:
signal<void()> list_of_actions;
Quindi, si "connette" a che cosa mai gruppo di funzioni/funtori/callable cose che si desidera chiamare.
x.list_of_actions.connect(bind(&A::A_action, a));
x.list_of_actions.connect(bind(&B::B_action, b));
x.list_of_actions.connect(bind(&C::C_action, c));
Nota, che ho utilizzato bind
. Quindi, il tipo di funzioni in list_of_actions è lo stesso, ma possiamo collegarlo a diversi tipi di classi. Quindi:
bind(&A::A_action, a)
Questa cosa, produce una cosa callable, di tipo void()
come abbiamo dichiarato il tipo di list_of actions
in precedenza. Ovviamente, si specifica l'istanza in cui si desidera applicare questa funzione membro nel secondo parametro.
Se si utilizzano elementi multi-thread, utilizzare la sorella signals2.
Spero che questo aiuti.
ringrazia Arak per aver dedicato del tempo e aggiungendo l'esempio. questo conclude la mia ricerca. Brillante! – Bach
una risposta superba. – Ross