• 读书笔记_Effective_C++_条款三十五:考虑virtual函数以外的其他选择


    看书走一遍  effective  c++

    使用bind function  取代虚函数吗 

    虚函数实现策略模式   使用bind + function实现策略模式     策略模式  不用讲了吧  

    https://www.cnblogs.com/qicosmos/p/4527804.html

    两种 实现  策略模式的方法   一种使用虚函数  一种使用bind function 方法  对比  

    #include<iostream>
    #include<functional>  
    
    using namespace std;
    using std::placeholders::_1;//解决bind 站位符号 看cpp primer   标准bind  那里有讲解
    using std::placeholders::_2;
    
    //1.虚函数方式实现策略模式
    class Calculater
    {
    public:
        virtual int calculate(int x, int y) = 0;
    };
    
    class Minus : public Calculater
    {
    public:
        int calculate(int x, int y) 
        {
            return x - y;
        }
    };
    
    class Plus : public Calculater
    {
    public:
        int calculate(int x, int y) 
        {
            return x + y;
        }
    };
    
    class CalcuClient
    {
    private:
        Calculater* m_caculater;
    public:
        CalcuClient(Calculater* caculater) : m_caculater(caculater){}
    
        int calculate(int x, int y)
        {
            return m_caculater->calculate(x, y);
        }
    };
    
    //使用  2.bind+function方式实现策略模式
    class NewCalcuClient
    {
    private:
        std::function<int(int, int)> m_function;
       // std::function<int(int, int, double)> m_function1;
    
    public:
        NewCalcuClient(std::function<int(int, int)> function) : m_function(function){}
        //NewCalcuClient(std::function<int(int, int, double)> m_function1) : m_function_other(function){}
        
        int calculate(int x, int y)
        {
            return m_function(x, y);
        }
    };
    
    int main(){
        Minus minus;// -
        CalcuClient client(&minus);//传入一个派生类的对象的引用  到参数为基类指针的构造函数中去   基类指针调用虚函数  即虚基类 的虚函数
    
        Plus plus;// +
        CalcuClient client2(&plus);
    
        int r = client.calculate(7, 4);
        int r2 = client2.calculate(7, 4);
        cout<<"r= "<<r<<endl;
        cout<<"r2= "<<r2<<endl;
    
        //bind+function
        NewCalcuClient newclient(bind(&Minus::calculate, &minus, _1, _2));
        NewCalcuClient newclient2(bind(&Plus::calculate, &plus, _1, _2));
    
        int r3 = newclient.calculate(7, 4);
        int r4 = newclient2.calculate(7, 4);
        cout<<"r3= "<<r3<<endl;
        cout<<"r4= "<<r4<<endl;
        
        return 0;
    }
  • 相关阅读:
    Tomcat December 31,2019
    XML
    Java
    mysql8.0.16安装(补) September 24,2019
    乱码中的编码和解码
    idea优化
    新版web.xml
    重定向和请求转发
    web下载文件设置的头信息
    响应状态码
  • 原文地址:https://www.cnblogs.com/zhangkele/p/10639938.html
Copyright © 2020-2023  润新知