技术标签: messagebus c++ 阻塞式 C++11 消息总线
boost::unordered_multimap<string, boost::any> m_map;
#pragma once
#include <functional>
#include <map>
#include <string>
#include <iostream>
#include <any>
// 简单的消息分发机制
// ref:https://www.cnblogs.com/qicosmos/archive/2013/04/28/3048919.html
// 《深入应用C++11代码优化与工程级应用》第12章
class MessageBus
{
public:
// regist message
template< class... _Args, class _Func, class = typename std::enable_if<!std::is_member_function_pointer<_Func>::value>::type>
void attach(std::string key, _Func && func)
{
std::function<void(_Args...)> fn = [&](_Args... args) {
return func(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, std::move(fn)));
}
// non-const member function
template<class... _Args, class _Class, class... _DeclareArgs, class _Object>
void attach(std::string key, void(_Class::*func)(_DeclareArgs...), _Object & object)
{
std::function<void(_Args...)> fn = [&, func](_Args... args) {
return (object.*func)(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, fn));
}
// const member function
template<class... _Args, class _Class, class... _DeclareArgs, class _Object>
void attach(std::string key, void(_Class::*func)(_DeclareArgs...) const, _Object & object)
{
std::function<void(_Args...)> fn = [&, func](_Args... args) {
return (object.*func)(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, fn));
}
// Broadcast messages, call all the callback functions
template<typename... _Args>
void sendMessage(std::string key, _Args... args)
{
auto range = m_map.equal_range(key);
for (auto it = range.first; it != range.second; it++)
{
std::function<void(_Args...)> func = std::any_cast<std::function<void(_Args...)>>(it->second);
func(args...);
}
}
// remove message
template<typename... _Args>
void remove(std::string key)
{
auto range = m_map.equal_range(key);
m_map.erase(range.first, range.second);
}
public:
MessageBus() = default;
~MessageBus() = default;
private:
MessageBus(const MessageBus&) = delete;
MessageBus& operator=(const MessageBus&) = delete;
static std::multimap<std::string, std::any> m_map;
};
static MessageBus g_messagebus; // 全局消息总线
#pragma once
#include <functional>
#include <map>
#include <string>
#include <iostream>
#include <boost/any.hpp>
#include <boost/lexical_cast.hpp>
// 简单的消息分发机制
// ref:https://www.cnblogs.com/qicosmos/archive/2013/04/28/3048919.html
// 《深入应用C++11代码优化与工程级应用》第12章
class MessageBus
{
public:
// regist message
template< class... _Args, class _Func, class = typename std::enable_if<!std::is_member_function_pointer<_Func>::value>::type>
void attach(std::string key, _Func && func)
{
std::function<void(_Args...)> fn = [&](_Args... args) {
return func(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, std::move(fn)));
}
// non-const member function
template<class... _Args, class _Class, class... _DeclareArgs, class _Object>
void attach(std::string key, void(_Class::*func)(_DeclareArgs...), _Object & object)
{
std::function<void(_Args...)> fn = [&, func](_Args... args) {
return (object.*func)(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, fn));
}
// const member function
template<class... _Args, class _Class, class... _DeclareArgs, class _Object>
void attach(std::string key, void(_Class::*func)(_DeclareArgs...) const, _Object & object)
{
std::function<void(_Args...)> fn = [&, func](_Args... args) {
return (object.*func)(std::forward<_Args>(args)...); };
m_map.insert(std::make_pair(key, fn));
}
// Broadcast messages, call all the callback functions
template<typename... _Args>
void sendMessage(std::string key, _Args... args)
{
auto range = m_map.equal_range(key);
for (auto it = range.first; it != range.second; it++)
{
std::function<void(_Args...)> func = boost::any_cast<std::function<void(_Args...)>>(it->second);
func(args...);
}
}
// remove message
template<typename... _Args>
void remove(std::string key)
{
auto range = m_map.equal_range(key);
m_map.erase(range.first, range.second);
}
public:
MessageBus() = default;
~MessageBus() = default;
private:
MessageBus(const MessageBus&) = delete;
MessageBus& operator=(const MessageBus&) = delete;
static std::multimap<std::string, boost::any> m_map;
};
static MessageBus g_messagebus; // 全局消息总线
sendMessage
业务逻辑。#include "messagebus.h"
#include <iostream>
std::multimap<std::string, std::any> MessageBus::m_map;
// 使用boost的使用 std::multimap<std::string, boost::any> MessageBus::m_map;
class Test
{
public:
void test(int, const char*) {
std::cout<< "hit test" << std::endl;
return;
}
};
int main()
{
Test t;
std::string key = "test";
// 订阅"test"消息,回调函数为Test::test
g_messagebus.attach<int, const char*>(key, &Test::test, t);
// 向订阅者发送消息,消息参数是 123 和 "abc",回调函数Test::test将会被执行
g_messagebus.sendMessage<int, const char*>(key, 123, "abc");
// 移除订阅"test"
g_messagebus.remove<int, const char*>(key);
return 0;
}
+请参考我的另一篇博客 : 使用C++11实现的非阻塞消息总线message_bus
1.打开网址,清华大学开源软件镜像站:https://mirrors.tuna.tsinghua.edu.cn/2.找到对应版本点击即下载,在这里我下载的是4.2.0的64位版本(我是win10系统)3.下载后按指引安装即可4.安装完成后,可以在开始菜单看到对应选项,我们接着需要在Anaconda中安装TensorFlow,为了避免从国外下载速度过慢的问题,我们先在Anaconda修改国内镜像源:①首先,打开Anaconda Prompt窗口,执行命令:conda config --add
CronTrigger TutorialIntroductioncron is a UNIX tool that has been around for a long time, soits scheduling capabilities are powerful and proven. TheCronTrigger class is based on the scheduling c
"安装程序无法创建新的系统分区" 怎么办? XP换Win7系统问题1 步骤一:利用PE系统里的虚拟光驱软件加载WIN7 ISO文件。 PS: 一般PE系统都集成了该类软件的。 2 步骤二:将WIN7系统中的三个文件(夹)【boot、sources、bootmgr】拷贝到C盘根目录。 PS:先格式化C盘,再拷贝系统文件到C盘 3 步骤三:开始菜单中运行"c:\boot\boots...
一、table中序号、表格渲染//身份证号表头 sfzhtabHead: [ { // type: 'index', width: 60, align: "left", title: "序号", fixed: "left", render: (h, params) => { return h("span", params.ind.
全虚拟化(Full virtualization), 也称为原始虚拟化技术, 是另一种虚拟化方法. 该模型使用虚拟机协调客户操作系统和原始硬件(见图2). 这里"协调"是一个关键词, 因为VMM在客户操作系统和裸硬件之间用于工作协调. 一些受保护的指令必须由Hypervisor(虚拟机管理程序)来捕获和处理. 因为操作系统是通过Hypervisor来分享底层硬件. 图2. 全虚拟
本节讲述代码分块(Bank)管理思想下可执行文件的重构,即对程序编译后的可执行文件进行重新组织、打包,以在加载阶段获得最高的执行效率,减少内存占用。要使执行效率高,意味着可执行文件的格式尽可能简单,解析执行文件的流程简单,相应地,解析过程代码量少,即能够减少内存的占用。
out.write("<html>\r\n"); out.write("<head>\r\n"); out.write(" <title>简单使用JSP</title>\r\n"); out.write("</head>\r\n"); out.write("<body>\r\n");String s = "HelloWorda";out.println(s); out.write("\r\n");...
经原文博主同意转到该处记录:https://www.cnblogs.com/wwjj4811/p/10364580.html(一)(适用于单体架构)当我们点击Download Sources时:有时候idea会出现cannot download sources的情况,如下图解决办法如下:打开idea右下角的terminal在里面输入mvn dependency:resolve -Dclassifier=sources如下图所示:然后回车稍等片刻:看到..
题记:内存管理一直是C/C++程序的红灯区。关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面,很多C/C++书籍中都使用技巧的介绍。另一类是内存管理的实现,如linux内核的slab分配器,STL中的allocator实现,以及一些特定于某种对象的内存管理等。最近阅读了一些内存管理实现方面的
题意:滥竽充数的故事,本来是x^2的方形矩阵有一个人滥竽充数,但是换了国王之后他要把这些人分成d份,每一份也组成一个正方形(此时那个滥竽充数的就只能走掉了),然后输入d,让你求解原来的满足条件的第k个数就多少(就是正方形的边长);x^2=d*y^2+1毕竟是刚学的新知识,虽然是入门数论,还是单独写一个吧,佩尔方程:x^2-dy^2=1。 这个可以求解很多有趣的不定方差。先看一下推导...
之前安装的是两个节点的RAC 平台。 数据库版本是10.2.0.1. 这个实验的目的就是将这个数据库版本从10.2.0.1 升级到 10.2.0.4. 升级包可以从Oracle metalink上进行下载,这个下载需要Oracle 付费的帐号。 网络可能也有资源下载。 10.2.0.4的patch number 是:p6810189。 两个节点的RAC 安装,参考Blog:
《C语言程序设计》实验报告专业: 班级: 学号: 学生姓名:实验日期: 成绩: 指导老师:实验单元一 程序基本结构设计实验题目实验一 熟悉VC++环境实验目的1. 熟悉C程序编辑环境,掌握主要菜单项的作用。2. 熟悉编写一个C程序的上机过程(编辑、编译、链接和运行)。3. 熟悉C程序的基...