#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的累加。