一个基于c++的计算机简单加减模型

 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
};

 

 

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值