初始版中的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.zipsummery:
在C++里根本无法实现真正意义上的双分派,只能靠引入附加的类型信息来模拟,这里所说的模拟其实是三个类型当作两个用,看看Dispatcher::go(BaseLhs& a, BaseRhs& b)就发现多出了类型Dispatcher和一个绑定名称go就明白了,非常的不同于obj->foo().
它的优缺点可以看: 《Modern C++ Design》的第11章,还有GoF的Visitor模式介绍时也提到过.
就我所知道的应用领域:
. 物理系统中的物物碰撞
. 分布式计算系统中的多重计算host的代理模型
. 游戏场景管理的autocell grid式也可以用到(这个时候需要个3d数组)