里面有个概念,基本上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