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