c++ boost库提供的signal2很好用,适用于某一处需要执行多个函数,但是具体的函数个数和种类需要在运行时调整的情况。
#include <boost/signals2.hpp> // for signal2
typedef boost::signals2::signal<void(const int&)> VoidSignal;
VoidSignal my_signal_; //定义一个信号
class ClassA
{
public:
ClassA(VoidSignal& mysignal)
{
//将这个类的func函数连接到mysignal信号
mysignal.connect(boost::bind(&ClassA::func, this, boost::placeholders::_1));
}
void func(const int& a)
{
// do something
}
}
int main(int argc, char **argv)
{
ClassA a1(my_signal_);
ClassA a2(my_signal_);
my_signal_(1); //依次执行所有connect了的函数
}
这里连接信号connect后的函数不能直接用ClassA::func,因为它还没有实例化。所以这里必须用boost::bind处理一下这个类里的函数,把this包含进去,从而让程序在运行时能知道这个函数具体是那个对象的。placeholders是占位符,函数有几个参数就需要几个占位符。
类似的std库里也有std::bind和std::placeholders。