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命名空間中微軟採用面對物件的方式重新定...