》中的並無多大的不同,只不過更加智慧型而已。其中最為關鍵的是,winx引入了一種技巧,它可以在編譯期判斷乙個函式是否被過載。簡單來說,winx的訊息分派偽**如下:
template
<
class
t>
class
windowmessage};
簡單看乙個實際的例子,這樣做的好處就很明了了。設想windowmessage的派生類只過載了onpaint,那麼windowmessage類看起來是這樣的:
template
<
class
t>
class
windowmessage};
並最終被編譯器優化為:
template
<
class
t>
class
windowmessage};
特別地,如果windowmessage派生類沒有響應任何訊息,則優化後dispatchmessage為乙個空函式,如下:
template
<
class
t>
class
windowmessage};
這就是winx的訊息分派機制為何比mfc、wtl以及其他任何介面庫高效(無論是編譯後的**尺寸上,還是執行效率上)的原因。
好了,現在該是解釋winx如何做到這一點——檢測派生類是否過載某個函式的時候了。我們假設,基類(名為base)中有乙個成員函式func(假設有兩個引數),現在有另乙個成員函式caller希望根據派生類是否過載func來做事情。如下:
template
<
class
t>
class
base
void
caller()
else}};
rettype func(argtype1 arg1, argtype2 arg2,
intunused =0
); 或者直接改為可變引數:
rettype func(argtype1 arg1, argtype2 arg2, ...);
當然,派生類過載func原型還是需要按我們預期的:
rettype func(argtype1 arg1, argtype2 arg2);
如此,判斷「派生類是否過載了func」就變成了判斷函式原型是否為
rettype func(argtype1 arg1, argtype2 arg2);
winx的訊息分派機制源**
WINX的訊息分派機制
by 許式偉 at 2006 11 1 winx的訊息分派是卓越的 我們先簡單回顧一下winx的sdi風格的hello程式與mfc wtl sdk的對比 mfc和wtl有著類似messagemap 儘管內部機制大不一樣 是通過巨集實現訊息分派的。也許你已經習慣了響應訊息時提供messagemap,但...
Window訊息機制 2
對話方塊程式的初始化顯示 可以在oninitdialog中增加相應的初始處理方法。自定義訊息對映處理例項 定義乙個訊息 define wm doextwork wm user 500 在對應的對話方塊類中通過on message wm doextwork,ondoextwork 實現訊息對映,在對話...
Android的訊息機制
android的訊息機制主要是指handler的執行機制,而handler的執行離不開messagequeue和looper的支撐。其中messagequeue稱為訊息佇列,用作儲存一組訊息,並以佇列的形式對外提供插入和刪除工作 具體實現 使用單鏈表的結構來儲存訊息列表 messagequeue不能...