暴力双分派速度快,可是当类增多时,代价依然很大。
map双分派在速度优化上有dynamic_cast和static_cast两种选择,Loki把这个选择做成了Policy。
矩阵双分派速度上有天然的优势,但是你要修改你的类。于是Loki也把这个做成了Policy供你选择。
矩阵双分派的思想是,在你的class里保存分配器使用的一个id值,分配器可以随时获取或者设置它。分派器操作此值构造矩阵,这样双分派变成了二维平面上的Point找寻,而且这个点的x、y标你都知道,这是可以的最快的分派查询方式了。
map双分派使用了局部类的思想可以和仿函数有机结合在一起。你可以保存函数的状态。
再论双分派,我想说点于双分派外得到的东西。
暴力双分派给我们的启示是template给我们了一个驱动编译器的工具,你可以使用if-else和递归让编译器帮你生成代码。
map双分派告诉我们对局部类的使用方式,它还给我们一次使用C++编译器开发者常用但我们不常用的技术(局部类)的机会,了解这些对你使用C++有很大的帮助。
矩阵双分派的思想不难想到,技术也常用,但是它的难度在于第一个想到这么做的人如何思考的。
三种双分派策略组合到库里的时候,Loki又向你展示了Policy的作用和效果。
关于Policy,我觉得它给我的其实很多。一直以来,我都讨厌被写成很大的类,它不便阅读,自然维护性非常差,而且我总认为这样做是在借助C++的封装做C的事情,C中遇到的问题你都会遇到,因为你的类足够大了。
但是,有事拆分一个类同样很难,至少很多时候我不知道如何做决定,在类庞大了,维护不方便的时候才想起来其实以前该拆分的,但这个时候已经很晚了。Policy给了我一个提示。你可以组装,运用模板或者继承,对原件的维护就是对一个小类的维护,这样会好很多。是的,看懂、维护组装关系一样会在Policy多的时候成为问题,但是,其一,你有选择的自由,其二,这至少使得问题可以得到解决。