当前位置: 首页 > news >正文

C++11观察者模式示例

该示例代码采用C11标准,解决以下问题:

  1. 消除了类继承的强耦合方式;
  2. 通知接口使用可变参数模板,支持任意参数;

示例代码

.h文件如下:

#include <functional>
#include <string>
#include <map>

class NonCopyable
{
protected:
	NonCopyable() = default;
	~NonCopyable() = default;
	NonCopyable(const NonCopyable&) = delete;
	NonCopyable& operator=(const NonCopyable&) = delete;
};

template<typename Func>
class Events : NonCopyable
{
public:
	Events()
	{

	}
	~Events(){}

	int Connect(Func&& f)
	{
		return Assgin(f);
	}

	int Connect(const Func& f)
	{
		return Assgin(f);
	}

	void DisConnect(int key)
	{
		m_connections.erase(key);
	}

	template<typename... Args>
	void Notify(Args&&... args)
	{
		for (auto& it:m_connections)
		{
			it.second(std::forward<Args>(args)...);
		}
	}

private:
	template<typename F>
	int Assgin(F&& f)
	{
		int k = m_observerId++;
		m_connections.emplace(k,std::forward<F>(f));
		return k;
	}
	int m_observerId = 0;
	std::map<int, Func> m_connections;
};

.cpp文件如下:

#include <iostream>
#include "C++11_Observer.h"

using namespace std;
struct stA
{
    int a, b;
    void print(int a, int b)
    {
        cout << a << " , " << b << endl;
    }
};

void print(int a, int b)
{
    cout << a << " , , " << b << endl;
}

int main()
{
    Events<std::function<void(int, int)>> myevent;

    auto key = myevent.Connect(print);
    stA t;
    auto lamadakey = myevent.Connect([&t](int a, int b) {t.a = a; t.b = b; });

    std::function<void(int, int)> f = std::bind(&stA::print,&t,std::placeholders::_1,std::placeholders::_2);

    myevent.Connect(f);
    int a = 1, b = 2;
    myevent.Notify(a,b);

    myevent.DisConnect(key);
    system("pause");
    return 0;
}

输出结果如下:
在这里插入图片描述

相关文章:

  • 微信打字赚钱平台30元广告优化师发展前景
  • 装饰公司响应式网站建设案例外贸推广渠道有哪些
  • 长沙做医院的网站建设搜索引擎广告的优缺点
  • 赤峰企业网站建设网站站长
  • 开发平台教程石家庄百度搜索引擎优化
  • 找人做一下网站大概多少钱深圳百度代理
  • C语言单链表的增删改补
  • 从制造业历史来看,汽车兴,则制造业兴,则国兴,则机器视觉兴
  • 云原生与微服务的关系
  • Git 换行符警告(LF replaced by CRLF)的解决方案
  • 【无人机】PX4 飞控系统架构
  • 【Scratch编程系列】Scratch编程软件界面
  • b4a安卓开发技术和建议,VB6开发Android APK
  • AT_abc212_d [ABC212D] Querying Multiset
  • 搭建健康基石,畅享活力人生
  • 大模型 MCP:开启 AI 与现实世界的无缝交互革命
  • CSS语言的学习路线
  • Android DiaLog全屏设置,带有叉号的弹窗,这个弹窗分为两个部分,一个是主体,另一个是关闭部分。自定义布局弹窗
  • BN 层的作用, 为什么有这个作用?
  • 常见的HR面问题汇总
  • 知识图谱:知识图谱多模态推理技术详解
  • Spring Boot 中利用 Jasypt 实现数据库字段的透明加密解密
  • OBS 录屏软件 for Mac 视频录制
  • 大数据(4.2)Hive核心操作实战指南:表创建、数据加载与分区/分桶设计深度解析
  • AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)
  • MyBatis Plus 在 ZKmall开源商城持久层的优化实践