里面有個(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