读书笔记_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;
}
原文地址:https://www.cnblogs.com/zhangkele/p/10639938.html