0 前提:
这段代码实现了一个简单的加减乘除运算的框架,
- 构建函数初始化映射表:在SB类的函数中,通过unordered_map<int,funptr>hanshumap存储了操作类型与对应的处理函数的映射关系,这个映射表将(int a1=1,a2=-2,a3=3,a4=4)与具体的处理函数(jia,jian,chen,chu)绑定到一起。
- gethandler函数获取处理函数:这里接收一个传入的操作类型获取对应的处理函数。在gethandler函数中,根据传入的操作类型获得对应的处理函数。(即就是通过hanshumap表查找对应的处理函数,找到返回函数;找不到,输出传入错误)
- 使用bind进行延迟绑定:在构造函数中,通过bind函数将每个处理函数与当前的SB对象进行绑定,以确保在处理函数中可以访问到当前对象的成员变量和函数。
综上所述,这个框架实现了一个简单的加减乘除运算,通过使用映射表和函数指针来实现;了操作类型与处理函数的动态绑定,使得代码更加灵活和可扩展。
使用的技术栈:bind, lambda, 函数回调,unordered_map
1 代码如下:
1.1 main.cpp
#include<iostream>
#include"sb.h"
using namespace std;
int main() {
SB server;
float jiaresult=server.getHandler(1)(10, 20);
float jianresult = server.getHandler(2)(5, 6);
float chenresult = server.getHandler(3)(7, 9);
float churesult = server.getHandler(4)(2, 8);
cout << "加的结果是" << jiaresult << endl;
cout << "减的结果是" << jianresult << endl;
cout << "乘的结果是" << chenresult << endl;
cout << "除的结果是" << churesult << endl;
return 0;
}
1.2 sb.h
std::bind(&SB::jia, this, _1, _2)
创建了一个函数对象,将 SB
类的成员函数 jia
与当前对象 this
进行了绑定,并将参数 _1
和 _2
占位符传递给 jia
函数。
通过 using namespace placeholders;
这个语句,将 std::placeholders
命名空间中的所有符号引入了当前的命名空间,因此在代码中就可以直接使用 _1
、_2
、_3
等占位符,而不需要显式地指明它们来自 std::placeholders
。
#pragma once
#include<unordered_map>
#include<functional>
#include"public.h"
using namespace std;
using namespace placeholders;
using funptr = std::function<float(float, float)>;
class SB {
public:
SB() {
hanshumap.insert({ a1, bind(&SB::jia, this, _1,_2) });
hanshumap.insert({ a2, bind(&SB::jian, this, _1,_2) });
hanshumap.insert({ a3, bind(&SB::chen, this,_1, _2) });
hanshumap.insert({ a4, bind(&SB::chu, this, _1, _2) });
}
float jia(float a, float b) {
return a + b;
}
float jian(float a, float b) {
return a -b;
}
float chen(float a, float b) {
return a * b;
}
float chu(float a, float b) {
return a /b;
}
// 获取消息对应的处理器
funptr getHandler(int msgid)
{
// 记录错误日志,msgid没有对应的事件处理回调
auto it = hanshumap.find(msgid);
if (it == hanshumap.end())
{
// 返回一个默认的处理器,空操作
return [=] (const float a, float b)->float{
cout<<"输入错误"<<endl;
return 0.0f;
};
}
else
{
return hanshumap[msgid];
}
}
private:
unordered_map<int, funptr> hanshumap;
};
1.3 public.h
#pragma once
enum ExampleEnum{
a1=1,
a2,
a3,
a4
};