यदि मैं आप थे, तो मैं इस कार्य को पूरा करने के लिए फ़ंक्शन पॉइंटर्स का उपयोग नहीं करता। इस विकल्प को गुरुओं को छोड़ दें;)
बूस्ट में, 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;
उसके बाद, आप यह कार्य/functors/प्रतिदेय चीजों में से जो भी समूह आप कॉल करना चाहते करने के लिए "कनेक्ट":
सबसे पहले, आप जगह है कि प्रतिनिधियों रखती घोषणा करते हैं।
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 का उपयोग करें।
उम्मीद है कि मदद करता है।
समय लेने और उदाहरण जोड़ने के लिए अराक धन्यवाद। जो मेरी खोज निष्कर्ष निकाला है। प्रतिभाशाली! – Bach
एक शानदार उत्तर। – Ross