初始版中的DoubleDispatcher::go要求參數上對象的類型是具體類型,這是個錯誤,見諒了!
具體的看原文《
醞釀了很久的雙分派器(Double Dispatcher)-- 初始版》
應該是 void go(const BaseLhs& a, const BaseRhs& b) const 樣,而BaseLhs和BaseRhs在DoubleDispatcher聲明時就被約束的,所以是 DoubleDispatcher的類型參數,同時MACRO CLASSID(N)要做點修正.
發布代碼經過了改正, 這里可以直接下載.
url:
http://www.shnenglu.com/Files/CornerZhang/DoubleDispatcher.zipsummery:
在C++里根本無法實現真正意義上的雙分派,只能靠引入附加的類型信息來模擬,這里所說的模擬其實是三個類型當作兩個用,看看Dispatcher::go(BaseLhs& a, BaseRhs& b)就發現多出了類型Dispatcher和一個綁定名稱go就明白了,非常的不同于obj->foo().
它的優缺點可以看: 《Modern C++ Design》的第11章,還有GoF的Visitor模式介紹時也提到過.
就我所知道的應用領域:
. 物理系統中的物物碰撞
. 分布式計算系統中的多重計算host的代理模型
. 游戲場景管理的autocell grid式也可以用到(這個時候需要個3d數組)