C++ 11关于新特性 计算器的实例1——function以及bind

发布时间:2024年01月18日

#include<iostream>
#include<functional>
#include<map>
int add(int a,int b)
{
    return a+b;
}
int minus(int a,int b)
{
    return a-b;
}
class Mul
{
private:
     
public:
   int operator()(int a,int b)
   {
        return a*b;
   }
};
int add_3Canshu(int a, int b, int c)
{
    std::cout<<a+b+c<<std::endl;
    return a+b+c;
}

int main()
{
    
    int a,b;
    char symbol;

    std::cin>>a>>b>>symbol;

    auto divide = [](int a,int b)->int{return a/b;};
    // 实现计算器操作
    // switch (symbol)
    // {
    // case '+':
    //     std::cout<<add(a,b)<<std::endl;
    //     break;
    // case '-':
    //     std::cout<<minus(a,b)<<std::endl;
    //     break;
    // case '*':
    //     Mul mul;
    //     std::cout<<mul(a,b)<<std::endl;
    //     break;
    // case '/':
    //     printf("hello\n");
    //     std::cout<<divide(a,b)<<std::endl;
    //     break;
    // default:
    //     break;
    // }

    // 注册机
    std::map<char,std::function<int(int,int)>> cal;
    cal['+'] = add;
    cal['-'] = minus;
    cal['*'] = Mul();
    cal['/'] = divide;
    // std::placeholder: _1;
    auto add_3 = std::bind(add_3Canshu,std::placeholders::_1,std::placeholders::_2,100);
    cal['a'] = add_3;

    std::cout<<cal.find(symbol)->second(a,b)<<std::endl;

    return 0;
}

分析:? ? ? ??

????????分别通过类外的函数接口,仿函数和lambda表达式,来实现加减乘除的四则运算。我们可以通过分支结构来实现,各个算法的调用。但是这样不利于代码的可读性,以及运行的效率。

? 改进措施:

????????使用map容器,来实现运算符符号和运算方法的对组(pair);运算方法的参数和返回值的类型相同,可以通过 类模板?std::function?是通用多态函数包装器 来进行统一对象的封装形式。

? ? ? ? 因为此时使用的通用多态函数包装器,各个功能函数接口的的参数个数是一定的都是两个。不利于多个参数的接口使用。

解决方法:

? ? ? ? 使用C++标准库下的bind() 函数以及placeholders(占位)配合使用来实现, 灵活控制参数的个数

? ? ? ???auto add_3 = std::bind(add_3Canshu,std::placeholders::_1,std::placeholders::_2,100);

绑定add_3Canshu接口,占用参数1,参数2,将参数3置为100;实现通过两个参数对注册机内容的注册

结果:

? ? ? ? 实现输入三个参数 1, 2,’a'

? ? ? ? 结果:?cal['a'] = add_3; 通过‘a’ 来指定调用add_3的接口实现1,2,100的累加。

文章来源:https://blog.csdn.net/weixin_70822378/article/details/135619270
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。