用来解决(A,B,C)每类都有大量关系时选择相应函数.因为他们都是指针型
.如碰撞
,当然还有很多.暴力法缺点:要知道所有类且顺序不能乱
缺点:仍然产生M * N数量代码.静态分发只负责找正确类型,然后将找到的函数,然后启动
.要先排序型列.加上对称性
.仿函数可以保存变量.
函子分发器,将调用分发
至任何对象.内部包含一个基本分发器
,即后端.用来存储函子
.在这个分发器里面将基针
转为具体继承针
.分发器编译期
就会发现重载歧义
总之,在继承体系中,出现多个基
,则必须用动转
,否则静转
就行了.然后将转型
也视为策略.
c++虚函数是唯一运行期多态机制
,且只适用于单对象
编译期的多对象多态
已实现(调用具体函数).主要适用(*,*,*...
)这种基*到基*
的函数,需要一组算法.要注意顺序(继承顺序,最特殊的在最前面),注意对称性,这样函数就少多了.
对数双分发
,还是注册,最后的矩阵分发
,借助神奇的宏
了,还有排序向量,时间空间都要好些
,
基本分发器,同样是个注册器.要把所有相关的都要注册上.使用蹦床函数
来在调用其他函数前,作些调整.函数指针
可作为非类型模板参数
,该函数必须具外部链接
.函数指针->模板参数,这样不必用映
来保存它,因为编译器知道它的静态信息,因此编译器可将函数地址写死在蹦床函数中
.类似前向
,只不过加了些信息.
元<类 一些左边,类 一些右边,结果类型(*回调)(一些左边&,一些右边&)>
空 加(){
构 本地{
静 结果类型 蹦床(基左边&左手边,基右边&右边)
{
中 回调(转换左边::转换(左手边),转换右边::转换(右边));//还有蹦床逆,交换左右手.
}};
加<一些左边,一些右边>(&本地::蹦床);
如(对称){
加<一些右边,一些左边>(&本地::蹦床r);
}//一下加两个,有对称性
//这个地址是写死了.
}//蹦床就是在调用时,再加一些相关信息
//因为直接搞,缺少了部分信息
元<类 一些左边,类 一些右边>
空 加(回调类型 函数){
常 键型 键(具型(一些左边),具型(一些右边));
m回调映射[键]=函数;
}//挨个加
//基本分发器是这样,回调函数中有些东西不一样.
//编译器可以优化,
m_ffd.加<圆&,圆&,仿函数<标::串,类型列表_2(圆&,圆&)>>(圆仿函数);
m_ffd.加<矩形&,椭圆&,仿函数<标::串,类型列表_2(矩形&,椭圆&)>>(矩仿函数);
//使用.
又 仿函数<结果类型,实参列表,洛基默认线程>函数子类型;//这里为,函数子类型,根据这个来适配函数.
可以定义仿函子分发器
,通过仿函子的适配器,来搞定.这样后端_.元 加<一些左边,一些右边>(函数子类型(适配器(函数)));
.定义一个适配器
+函数.
两全其美,任何时候都可高速,必要时安全
.只需要在默认动转
,在与形状时(无钻石继承)
特化为安全(静转)
只要无钻石时,都可静转
然后,后端
,也可以直接改成快速
版本,这就是策略的优势.