学习AA大神c++设计新思维笔记:11多方法

多方法

用来解决(A,B,C)每类都有大量关系时选择相应函数.因为他们都是指针型.如碰撞,当然还有很多.暴力法缺点:要知道所有类且顺序不能乱
缺点:仍然产生M * N数量代码.静态分发只负责找正确类型,然后将找到的函数,然后启动.要先排序型列.加上对称性.仿函数可以保存变量.
函子分发器,将调用分发至任何对象.内部包含一个基本分发器,即后端.用来存储函子.在这个分发器里面将基针转为具体继承针.分发器编译期就会发现重载歧义
总之,在继承体系中,出现多个,则必须用动转,否则静转就行了.然后将转型也视为策略.
c++虚函数是唯一运行期多态机制,且只适用于单对象
编译期的多对象多态已实现(调用具体函数).主要适用(*,*,*...)这种基*到基*的函数,需要一组算法.要注意顺序(继承顺序,最特殊的在最前面),注意对称性,这样函数就少多了.
对数双分发,还是注册,最后的矩阵分发,借助神奇的了,还有排序向量,时间空间都要好些,
基本分发器,同样是个注册器.要把所有相关的都要注册上.使用蹦床函数来在调用其他函数前,作些调整.函数指针可作为非类型模板参数,该函数必须具外部链接.函数指针->模板参数,这样不必用映来保存它,因为编译器知道它的静态信息,因此编译器可将函数地址写死在蹦床函数中.类似前向,只不过加了些信息.

<类 一些左边,类 一些右边,结果类型(*回调)(一些左边&,一些右边&)>
        空 加(){
            构 本地{
            静 结果类型 蹦床(基左边&左手边,基右边&右边)
            {
                中 回调(转换左边::转换(左手边),转换右边::转换(右边));//还有蹦床逆,交换左右手.
            }};<一些左边,一些右边>(&本地::蹦床);(对称){<一些右边,一些左边>(&本地::蹦床r);
            }//一下加两个,有对称性
            //这个地址是写死了.
        }//蹦床就是在调用时,再加一些相关信息
//因为直接搞,缺少了部分信息<类 一些左边,类 一些右边>
    空 加(回调类型 函数){
        常 键型 键(具型(一些左边),具型(一些右边));
        m回调映射[]=函数;
    }//挨个加
//基本分发器是这样,回调函数中有些东西不一样.
//编译器可以优化,
        m_ffd.<&,&,仿函数<::,类型列表_2(&,&)>>(圆仿函数);
        m_ffd.<矩形&,椭圆&,仿函数<::,类型列表_2(矩形&,椭圆&)>>(矩仿函数);
//使用.
        又 仿函数<结果类型,实参列表,洛基默认线程>函数子类型;//这里为,函数子类型,根据这个来适配函数.

可以定义仿函子分发器,通过仿函子的适配器,来搞定.这样后端_.元 加<一些左边,一些右边>(函数子类型(适配器(函数)));.定义一个适配器+函数.
两全其美,任何时候都可高速,必要时安全.只需要在默认动转,在与形状时(无钻石继承)特化为安全(静转)
只要无钻石时,都可静转
然后,后端,也可以直接改成快速版本,这就是策略的优势.

你可能感兴趣的:(笔记)