虽然这个库的名字乍一看好象有点误导,但实际上并非如此。 Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot),它基于以下概念:当对应的信号被发出时,相关联的插槽即被执行。 原则上,你可以把单词 '信号' 和 '插槽' 分别替换为 '事件' 和 '事件处理器'。 不过,由于信号可以在任意给定的时间发出,所以这一概念放弃了 '事件' 的名字。
因此,Boost.Signals 没有提供任何类似于 '事件' 的类。 相反,它提供了一个名为 boost::signal 的类,定义于boost/signal.hpp. 实际上,这个头文件是唯一一个需要知道的,因为它会自动包含其它相关的头文件。
Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 由于boost::signal 是最常被用到的类,所以它是位于名字空间boost 中的。
[cpp] view plaincopyprint?
void func()
{
std::cout<<"Hello World!"<<std::endl;
}
int main()
{
signals2::signal <void()> s;
s.connect(func);
s();
return 0;
}
boost::signal 实际上被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。 在这个例子中,只有签名为void () 的函数可以被成功关联至信号s。
函数 func() 被通过 connect() 方法关联至信号s。 由于func() 符合所要求的 void () 签名,所以该关联成功建立。因此当信号s 被触发时,func() 将被调用。
信号是通过调用 s 来触发的,就象普通的函数调用那样。 这个函数的签名对应于作为模板参数传入的签名:因为 void () 不要求任何参数,所以括号内是空的。
调用 s 会引发一个触发器,进而执行相应的 func() 函数 - 之前用connect() 关联了的。
因此,Boost.Signals 没有提供任何类似于 '事件' 的类。 相反,它提供了一个名为 boost::signal 的类,定义于boost/signal.hpp. 实际上,这个头文件是唯一一个需要知道的,因为它会自动包含其它相关的头文件。
Boost.Signals 定义了其它一些类,位于 boost::signals 名字空间中。 由于boost::signal 是最常被用到的类,所以它是位于名字空间boost 中的。
[cpp] view plaincopyprint?
void func()
{
std::cout<<"Hello World!"<<std::endl;
}
int main()
{
signals2::signal <void()> s;
s.connect(func);
s();
return 0;
}
boost::signal 实际上被实现为一个模板函数,具有被用作为事件处理器的函数的签名,该签名也是它的模板参数。 在这个例子中,只有签名为void () 的函数可以被成功关联至信号s。
函数 func() 被通过 connect() 方法关联至信号s。 由于func() 符合所要求的 void () 签名,所以该关联成功建立。因此当信号s 被触发时,func() 将被调用。
信号是通过调用 s 来触发的,就象普通的函数调用那样。 这个函数的签名对应于作为模板参数传入的签名:因为 void () 不要求任何参数,所以括号内是空的。
调用 s 会引发一个触发器,进而执行相应的 func() 函数 - 之前用connect() 关联了的。