里面有個(gè)概念,基本上Boost里面也有,但有其獨(dú)到之處。

基本概念有CallableCaller,Callable,Signal,Connection & ScopedConnection。其特有的是CallableCaller是基于接口實(shí)現(xiàn)的,所以可以基于每個(gè)特化版本的接口用一個(gè)循環(huán)來(lái)驅(qū)動(dòng)管理,當(dāng)然,如果使用端code需要完成這樣的管理器的話。

它們之間的關(guān)系是:CallableCaller被Callable包含,Signal與Callable或CallableCaller鏈接(Signal<...>::Connect(...)),Connection和ScopedConnection是Signal做鏈接時(shí),需要做管理用的小對(duì)象,相當(dāng)于句柄類型,同時(shí)Connection是常規(guī)版本,而ScopedConnection是在作用域內(nèi)自動(dòng)釋放連接。

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();

限制:暫時(shí)支持此最多4個(gè)參數(shù)的函數(shù),暫時(shí)不支持成組的信號(hào)連接,未考慮線程安全性。

優(yōu)勢(shì): 支持成員函數(shù)綁定,由于已經(jīng)做了適當(dāng)?shù)拇a展開,編譯速度比起Loki和Boost中對(duì)應(yīng)的仿函數(shù)之類快好多,由此也看出Id Software的Ph.D們務(wù)實(shí)的作風(fēng)。在理解所組織的代碼后,很容易向更多的參數(shù)擴(kuò)充。控制在有限的代碼量?jī)?nèi),所以夠小。

本人看懂后,對(duì)原來(lái)代碼稍作了些改進(jìn)。改進(jìn)后非常統(tǒng)一,而且語(yǔ)義清晰,但發(fā)現(xiàn)Signal類的operator (...)與原來(lái)稍有不同了,原因在于這個(gè)重載的操作符的返回值上。~ ^^!

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