WINX的訊息分派機制(續2)

2021-04-16 12:38:33 字數 1283 閱讀 1880

》中的並無多大的不同,只不過更加智慧型而已。其中最為關鍵的是,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不能...