里面有個概念,基本上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們務實的作風。在理解所組織的代碼后,很容易向更多的參數擴充??刂圃谟邢薜拇a量內,所以夠小。
本人看懂后,對原來代碼稍作了些改進。改進后非常統一,而且語義清晰,但發現Signal類的operator (...)與原來稍有不同了,原因在于這個重載的操作符的返回值上。~ ^^!
這里附上header \ *.lib
http://code.google.com/p/us-engine/downloads/list