远程过程调用-buttonrpc源码解析5-函数绑定

前面几节的文章里提到过“通过一定的技术手段,通知远程服务器调用某个函数来执行相应的功能”,本片文章分析服务端如何使用std::bind函数,统一函数调用形式。

1、先看一个简单的例子:
温馨提示:std::bind除了绑定普通函数,还可以绑定类的成员函数,当绑定的是类的非静态成员函数时,此时std::bind至少需要传递两个参数,第一个参数为类的成员函数,需要通过&类名::成员函数的方式填入参数;第二个参数为类对象或者类对象指针(若std::bind发生在某个类的成员函数内,则传递这个类的this指针,见最后buttonrpc源码)。

// 全局函数:只有一个int型参数
void globalFunc(int value)
{std::cout << __FUNCTION__ << " value = " << value << std::endl;
}class A
{
public:// 类中成员函数:两个参数,但最后一个是int型参数void classFunc(double valueA, int valueB){std::cout << __FUNCTION__ << " valueA = " << valueA << " valueB = " << valueB << std::endl;}// 类中静态成员函数:三个参数,但最后一个是int型参数static void classStaticFunc(char valueA, double valueB, int valueC){std::cout << __FUNCTION__ << " valueA = " << valueA << " valueB = " << valueB << " valueC = " << valueC << std::endl;}
};int main()
{std::map<std::string, std::function<void(int)>> mapData;A *a = new A;auto f1 = std::bind(globalFunc, std::placeholders::_1);mapData["global_func"] = f1;auto f2 = std::bind(&A::classFunc, a, 2.3, std::placeholders::_1);mapData["class_func"] = f2;auto f3 = std::bind(&A::classStaticFunc, 'c', 2.3, std::placeholders::_1);mapData["class_static_func"] = f3;mapData["global_func"](1);mapData["class_func"](2);mapData["class_static_func"](3);system("pause");return 0;
}

在这里插入图片描述
可以看到,型如上面的3个函数,故意设定了最后一个参数类型为int。这样,不管是全局函数还是类的成员函数,都可以通过std::bind的方式,提前绑定已知参数,得到std::function<void(int)>类型的函数对象,这样便可以统一存储在std::map<std::string, std::function<void(int)>>类型的容器中。

2、buttonrpc源码中的例子:

template<typename F>
inline void buttonrpc::bind( std::string name, F func )
{m_handlers[name] = std::bind(&buttonrpc::callproxy<F>, this, func, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
}template<typename F, typename S>
inline void buttonrpc::bind(std::string name, F func, S* s)
{m_handlers[name] = std::bind(&buttonrpc::callproxy<F, S>, this, func, s, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
}

上面的buttonrpc::bind( std::string name, F func )函数内,绑定成员函数buttonrpc::callproxy<F>,并将成员this传递进入,完成这2个必要参数后,将已知函数func传入,完成早期绑定;将后面的三个占位符作为晚期绑定。
同理,buttonrpc::bind(std::string name, F func, S* s)函数内,绑定成员函数buttonrpc::callproxy<F, S>,并将成员this传递进入,完成这2个必要参数后,将已知函数func和s传入,完成早期绑定;将后面的三个占位符作为晚期绑定。

int main()
{buttonrpc server;server.as_server(5555);server.bind("foo_1", foo_1);server.bind("foo_2", foo_2);server.bind("foo_3", std::function<int(int)>(foo_3));server.bind("foo_4", foo_4);server.bind("foo_5", foo_5);ClassMem s;server.bind("foo_6", &ClassMem::bar, &s);std::cout << "run rpc server on: " << 5555 << std::endl;server.run();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/579251.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——共享内存

Linux——共享内存 什么是共享内存共享内存原理Linux下共享内存的接口创建/获取共享内存&#xff1a;shmgetftok函数 映射共享内存到进程地址空间&#xff1a;shmat 解除共享内存映射&#xff1a;shmdt删除共享内存段&#xff1a;shmctl 利用共享内存进行通信 我们之前学习了匿…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生&#xff0c;考研还是就业&#xff0c;到底是重视专业课还是重视数学英语&#xff0c;这些问题一直困扰了我很久&#xff0c;但如今已经有了一些浅显的认识&#xff0c;所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

蓝桥杯刷题_day7_动态规划_路径问题

文章目录 DAY7下降路径最小和最小路径和地下城游戏 DAY7 下降路径最小和 【题目描述】 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元…

通过node 后端实现颜色窃贼 (取出某个图片的主体rgb颜色 )

1.需求 我前端轮播图的背景色 想通过每一张轮播图片的颜色作为背景色 这样的话 需要通过一张图片 取出图片的颜色 这个工作通过前端去处理 也可以通过后端去处理 前端我试了试 color-thief 的插件 但是 这个插件是基于canvas 的模式来的 我需要在小程序中使用这个插件 而且是…

Qt 完成图片的缩放拖动

1. 事件和函数 主要使用事件paintEvent(QPaintEvent *event)和drawTiledPixmap函数实现绘图。 paintEvent事件在改变窗口大小、移动窗口、手动调用update等情形下会被调用。需先了解下绘图该函数的用法。 - QPainter::drawTiledPixmap(int x, int y, int w, int h, const QPi…

web布局——说清楚fixed布局

极限省流 想要fixed做导航页面&#xff1a;指定清楚top、left、right、bottom&#xff0c;没指定清楚布局位置就会采用默认的方式&#xff1a; 0&#xff09;父元素的padding&#xff1a;fixed元素相对位移 1&#xff09;同级元素是fixed元素&#xff1a;覆盖 2&#xff09…

自定义类型:【联合体和枚举】

一.联合体 1.联合体类型的声明 联合体像结构体一样&#xff0c;也是有一个或者多个成员组成&#xff0c;当然也可以不同的类型。但不同的是&#xff0c;比编译器只为最大的成员分配足够的内存空间&#xff0c;所有成员共用同一块内存空间。所以联合体也叫做&#xff1a;共用体…

GEE22:基于目视解译的土地利用分类(随机森林监督分类)

采样点信息&#xff1a; 设置一下采样点参数&#xff1a; 代码&#xff1a; //设置研究区位置 var table ee.FeatureCollection("users/cduthes1991/boundry/China_province_2019"); var roi table.filter(ee.Filter.eq(provinces,beijing)); Map.centerObjec…

公司服务器被.rmallox攻击了如何挽救数据?

公司服务器被.rmallox攻击了如何挽救数据&#xff1f; .rmallox这种病毒与之前的勒索病毒变种有何不同&#xff1f;它有哪些新的特点或功能&#xff1f; .rmallox勒索病毒与之前的勒索病毒变种相比&#xff0c;具有一些新的特点和功能。这种病毒主要利用加密技术来威胁用户&am…

一、图片隐写[Stegsolve、binwalk、010editor、WaterMark、BlindWaterMark、文件头尾]

工具配置 1.Stegsolve 工具地址&#xff1a;http://www.caesum.com/handbook/Stegsolve.jar 解释&#xff1a;该工具需要安装jar包后才能配合使用&#xff0c;下面同时会给出快速打开工具的代码&#xff0c;需要两个文件&#xff0c;启动的时候启动vbs文件 start.bat java …

基于SpringBoot的“财务管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“财务管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 系统登录界面图 管理员功能界面图…

解决GNU Radio+USRP实现OFDM收发在接收端QPSK星座图映射无“抖动”问题

文章目录 前言一、遇到的问题二、解决方案三、重新编译安装四、验证五、资源自取 前言 本文记录在 GNU RadioUSRP 实现 OFDM 收发时&#xff0c;在接收端 QPSK 星座图映射无“抖动”问题的解决方法&#xff0c; 一、遇到的问题 我遇到的问题是&#xff0c;现在搭建的 OFDM 模…