初始版中的DoubleDispatcher::go要求参数上对象的类型是具体类型,这是个错误,见谅了!
具体的看原文《酝酿了很久的双分派器(Double Dispatcher)-- 初始版

应该是   void go(const BaseLhs& a, const BaseRhs& b) const 样,而BaseLhs和BaseRhs在DoubleDispatcher声明时就被约束的,所以是  DoubleDispatcher的类型参数,同时MACRO CLASSID(N)要做点修正.

发布代码经过了改正, 这里可以直接下载.
 url: http://www.cppblog.com/Files/CornerZhang/DoubleDispatcher.zip



summery:
  在C++里根本无法实现真正意义上的双分派,只能靠引入附加的类型信息来模拟,这里所说的模拟其实是三个类型当作两个用,看看Dispatcher::go(BaseLhs& a, BaseRhs& b)就发现多出了类型Dispatcher和一个绑定名称go就明白了,非常的不同于obj->foo().
  它的优缺点可以看: 《Modern C++ Design》的第11章,还有GoF的Visitor模式介绍时也提到过.

就我所知道的应用领域:
  . 物理系统中的物物碰撞
  . 分布式计算系统中的多重计算host的代理模型
  . 游戏场景管理的autocell grid式也可以用到(这个时候需要个3d数组)