里面有个概念,基本上Boost里面也有,但有其独到之处。

基本概念有CallableCaller,Callable,Signal,Connection & ScopedConnection。其特有的是CallableCaller是基于接口实现的,所以可以基于每个特化版本的接口用一个循环来驱动管理,当然,如果使用端code需要完成这样的管理器的话。

它们之间的关系是:CallableCaller被Callable包含,Signal与Callable或CallableCaller链接(Signal<...>::Connect(...)),Connection和ScopedConnection是Signal做链接时,需要做管理用的小对象,相当于句柄类型,同时Connection是常规版本,而ScopedConnection是在作用域内自动释放连接。

eg:

Functions::Callable cv(function1);

Functions::Callable ci(function1_1);

cv();

int r = ci();

Functions::Callable callr(function3_int);

r = callr(23,23);

Functions::Callable call(function3);

call(3,4);

Functions::Signal sign1;

Functions::Signal sign2;

Functions::Connection con = sign1.Connect(callr);

Functions::Connection con2 = sign2.Connect(call);

r = sign1(3,4);

sign2(8,3);

con2.Disconnect();

con.Disconnect();

限制:暂时支持此最多4个参数的函数,暂时不支持成组的信号连接,未考虑线程安全性。

优势: 支持成员函数绑定,由于已经做了适当的代码展开,编译速度比起Loki和Boost中对应的仿函数之类快好多,由此也看出Id Software的Ph.D们务实的作风。在理解所组织的代码后,很容易向更多的参数扩充。控制在有限的代码量内,所以够小。

本人看懂后,对原来代码稍作了些改进。改进后非常统一,而且语义清晰,但发现Signal类的operator (...)与原来稍有不同了,原因在于这个重载的操作符的返回值上。~ ^^!

这里附上header \ *.lib http://code.google.com/p/us-engine/downloads/list