C 11 MessageBus 訊息佇列實現

2021-09-07 18:29:49 字數 3813 閱讀 7653

any.h:

#pragma once

#include #include /*

類似於boost any類的實現

*/using namespace std;

struct any

any(any& that) :m_ptr(that.clone()), m_tpindex(that.m_tpindex) {}

any(any&& that) :m_ptr(move(that.m_ptr)), m_tpindex(that.m_tpindex) {}

// 建立智慧型指標時,對於一般的型別,通過decay來移除引用和cv符,從而獲取原始型別

template::type, any>::value, u>::type>

any(u &&value) : m_ptr(new derived::type>(forward(value))), m_tpindex(type_index(typeid(typename decay::type))) {}

bool isnull() const

templatebool is() const

// 將any轉換成實際的型別

templateu& anycast()

auto derived = dynamic_cast*> (m_ptr.get());

return derived->m_value;

} any operator=(const any& a)

private:

struct base;

typedef unique_ptrbaseptr;

struct base

virtual baseptr clone() const = 0;

}; templatestruct derived :base

baseptr clone() const

t m_value;

}; baseptr clone() const

return nullptr;

} baseptr m_ptr;

type_index m_tpindex;

};

function_traits.h:

#pragma once

#include #include #include using namespace std;

template struct function_traits;

templatestruct function_traits;

typedef ret function_type(args...);

typedef ret return_type;

using stl_function_type = function;

typedef ret(*pointer)(args...);

templatestruct args

;};//函式指標

templatestruct function_traits:function_traits{};

// std::function

template struct function_traits>:function_traits{};

//member function

#define function_traits(...) \

template\

struct function_traits:\

function_traits{};

function_traits()

function_traits(const)

function_traits(volatile)

function_traits(const volatile)

//函式物件

templatestruct function_traits:function_traits{};

templatetypename function_traits::stl_function_type to_function(const function& lambda)

templatetypename function_traits::stl_function_type to_function(function&& lambda)

templatetypename function_traits::pointer to_function_pointer(const function& lambda)

noncopyable.h:

#pragma once

class noncopyable

;

messagebus.h:

#pragma once

#include #include #include #include "any.h"

#include "function_traits.h"

#include "noncopyable.h"

using namespace std;

class messagebus :noncopyable

// 傳送訊息

templatevoid sendreq(const string& strtopic = "") }

templatevoid sendreq(args&&...args, const string& strtopic = "") }

//移除某個主題,需要主題和訊息型別

templatevoid remove(const string& strtopic = "")

private:

templatevoid add(const string& strtopic, f&& f)

private:

multimapm_map;

typedef multimap::iterator iterater;

};

測試**:

// messagebus.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include "pch.h"

#include #include "messsagebus.h"

using namespace std;

int main()

); bus.attach((int& a) );

bus.attach((int&& a) );

bus.attach((const int& a) );

bus.attach((int a) ,"a");

int i = 2;

// 傳送訊息

bus.sendreq(2);

bus.sendreq(2,"a");

bus.sendreq(i);

bus.sendreq(2);

bus.sendreq(2);

// 移除訊息

bus.remove();

bus.remove("a");

bus.remove();

bus.remove();

bus.remove();

// 傳送訊息

bus.sendreq(2);

bus.sendreq(2, "a");

bus.sendreq(i);

bus.sendreq(2);

bus.sendreq(2);

}

測試結果:

Message Bus 訊息匯流排

liferay的 訊息匯流排 message bus 是一種服務級api,元件可以用它來傳送和接收訊息。它提供了訊息生產者 producers 和消費者 consumers 之間的松耦合。訊息匯流排 message bus 位於liferay的全域性類載入器中,使每個已部署的web應用程式都可以訪問...

C 訊息響應

在mfc中,訊息響應使用的是一種訊息對映的機制,而在c 中也有一套完整的機制,下面介紹c 中訊息處理的兩種方法 在c 中進行訊息響應有兩種方法,一種是在系統預定義的代表中新增新的事件,一種是過載視窗基類中的預定義訊息響應函式。在c 中預定義了很多的訊息響應的代表,比如 宣告乙個代表型別 public...

C 訊息機制

一 訊息概述 windows下應用程式的執行是通過訊息驅動的。訊息是整個應用程式的工作引擎,我們需要理解掌握我們使用的程式語言是如何封裝訊息的原理。1 什麼是訊息 message 訊息就是通知和命令。在.net框架類庫中的system.windows.forms命名空間中微軟採用面對物件的方式重新定...