初始版中的DoubleDispatcher::go要求參數(shù)上對象的類型是具體類型,這是個(gè)錯(cuò)誤,見諒了!
具體的看原文《醞釀了很久的雙分派器(Double Dispatcher)-- 初始版

應(yīng)該是   void go(const BaseLhs& a, const BaseRhs& b) const 樣,而BaseLhs和BaseRhs在DoubleDispatcher聲明時(shí)就被約束的,所以是  DoubleDispatcher的類型參數(shù),同時(shí)MACRO CLASSID(N)要做點(diǎn)修正.

發(fā)布代碼經(jīng)過了改正, 這里可以直接下載.
 url: http://www.shnenglu.com/Files/CornerZhang/DoubleDispatcher.zip



summery:
  在C++里根本無法實(shí)現(xiàn)真正意義上的雙分派,只能靠引入附加的類型信息來模擬,這里所說的模擬其實(shí)是三個(gè)類型當(dāng)作兩個(gè)用,看看Dispatcher::go(BaseLhs& a, BaseRhs& b)就發(fā)現(xiàn)多出了類型Dispatcher和一個(gè)綁定名稱go就明白了,非常的不同于obj->foo().
  它的優(yōu)缺點(diǎn)可以看: 《Modern C++ Design》的第11章,還有GoF的Visitor模式介紹時(shí)也提到過.

就我所知道的應(yīng)用領(lǐng)域:
  . 物理系統(tǒng)中的物物碰撞
  . 分布式計(jì)算系統(tǒng)中的多重計(jì)算host的代理模型
  . 游戲場景管理的autocell grid式也可以用到(這個(gè)時(shí)候需要個(gè)3d數(shù)組)