Nếu tôi là bạn, tôi sẽ không sử dụng các con trỏ hàm để hoàn thành nhiệm vụ này. Để tùy chọn này cho các bậc thầy;)
Trong Tăng cường, có một thư viện đẹp được gọi là signals. Nó làm cho cuộc sống của bạn dễ dàng hơn! Đây là một ví dụ về việc sử dụng:
#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();
}
này sẽ in:
Hello I am X!
A::A_action();
B::B_action();
C::C_action();
Sau đây là cách nó hoạt động.
Đầu tiên, bạn khai báo nơi chứa các đại biểu:
signal<void()> list_of_actions;
Sau đó, bạn "kết nối" nó với những gì từng nhóm chức năng/functors/callable điều bạn muốn gọi.
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));
Lưu ý rằng tôi đã sử dụng bind
. Vì vậy, rằng các loại hàm trong list_of_actions là như nhau, nhưng chúng ta có thể kết nối nó với các kiểu lớp khác nhau. Vì vậy:
bind(&A::A_action, a)
điều này, tạo ra một điều callable, kiểu void()
như chúng ta tuyên bố là loại list_of actions
trước đó. Tất nhiên, bạn chỉ định cá thể bạn muốn áp dụng chức năng thành viên này trong tham số thứ hai ..
Nếu bạn đang làm công cụ đa luồng, hãy sử dụng chị em signals2.
Hy vọng điều đó sẽ hữu ích.
cảm ơn Arak vì đã dành thời gian và thêm ví dụ. kết thúc tìm kiếm của tôi. Rực rỡ! – Bach
câu trả lời tuyệt vời. – Ross