IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++11 - 委托机制的实现TinyDelegate -> 正文阅读

[C++知识库]C++11 - 委托机制的实现TinyDelegate

1 使用C++11实现委托机制

1.1 TinyDelegate类

1.1.1 代码

TinyDelegate.hpp

#ifndef TINY_DELEGATE_H
#define TINY_DELEGATE_H

#include <functional>
#include <chrono>
#include <string>
#include <list>
#include<algorithm>


template<typename ... arguments>
class TinyDelegate
{
public:
	TinyDelegate() = default;
	virtual~TinyDelegate() = default;

public:	
	template<typename callable>
	TinyDelegate& operator += (const callable& func)
	{
		m_Funtion_List.push_back(std::function<void(arguments...)>(func));
		return *this;
	}

	template<typename Class, typename Method>
	TinyDelegate& operator += (const std::function<void(arguments...)>& func)
	{
		m_Funtion_List.push_back(func);
		return *this;
	}

	//TinyDelegate& operator -= (const std::function<void(arguments...)>& func)
	//{
	//	void(*const* ptr)(arguments...) = func.target<void(*)(arguments...)>();

	//	for (auto iter = m_Funtion_List.begin();iter != m_Funtion_List.end();iter++)
	//	{
	//		if (ptr)
	//		{
	//			if (*ptr == *iter)
	//			{
	//				m_Funtion_List.erase(iter);
	//				break;
	//			}
	//		}
	//	}
	//}

	void operator()(arguments... params)
	{
		for (auto func : m_Funtion_List)
		{
			func(params...);
		}
	}


private:
	std::list<std::function<void(arguments...)>> m_Funtion_List;
};

#endif

1.1.2 测试代码


#include <iostream>
#include <thread>
#include "TinyDelegate.hpp"

void print()
{
	std::cout << "print" << std::endl;
}

void print_string(const std::string& str)
{
	std::cout << "print_string : " << str << std::endl;
}

void add()
{
	std::cout << "add" << std::endl;
}

class Test
{
public:
	Test() = default;
	virtual~Test() = default;

public:
	void add()
	{
		std::cout << "Test::add" << std::endl;
	}
};


int main()
{
	Test test;
	TinyDelegate<> t_Delegate;

	t_Delegate += print;
	t_Delegate += add;
	t_Delegate += std::bind(&Test::add, test);
	t_Delegate += []() { std::cout << "lambda" << std::endl; };

	t_Delegate();


	TinyDelegate<std::string> t_Delegate_string;

	t_Delegate_string += print_string;

	t_Delegate_string("hello");

	getchar();

	return 0;
}

运行结果:

1.1.3 缺陷

由于std::function无法进行比较,暂时未实现-=操作符的重载,暂时未提供通过-=操作符删除委托的功能。也就是目前版本只能增加委托函数,不能删除委托函数。

如果有兴趣可以进我的个站逛逛:https://www.stubbornhuang.com/

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 23:54:34  更:2021-09-10 23:55:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:27:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码