Если бы я был вами, я бы не использовал указатели функций для выполнения этой задачи. Оставьте эту опцию гуру;)
В Boost есть красивая библиотека под названием signals. Это делает вашу жизнь проще! Это пример использования:
#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();
}
Это будет печатать:
Hello I am X!
A::A_action();
B::B_action();
C::C_action();
Вот как это работает.
Во-первых, вы заявляете, то место, которое держит делегатов:
signal<void()> list_of_actions;
Затем вы «подключить» его к тому, что когда-либо группа функций/функторов/Вызываемые вещей, которые вы хотите позвонить.
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));
примечание, это я использовал bind
. Итак, тип функций в list_of_actions одинаковый, но мы можем подключить его к разным типам классов. Итак:
bind(&A::A_action, a)
Эта вещь, производит вызываемую вещь, типа void()
, как мы объявили тип list_of actions
ранее. Конечно, вы указываете экземпляр, который хотите применить эту функцию-член во втором параметре.
Если вы делаете многопоточность, используйте свою сестру signals2.
Надеюсь, что это поможет.
благодарит Арака за то, что вы нашли время и добавили пример. что завершает мой поиск. Brilliant! – Bach
превосходный ответ. – Ross