13,【设计模式】代理

代理

代理

代理的本质是函数指针

代理分为单播,多播,动态多播(ue4中提出的)

单播:在网络通信中,单播是一种一对一的通信方式

多播:在网络通信中,多播是一种一对多的通信方式

支持任意参数的简单代理实现

advanced.h

cpp 复制代码
#pragma once
#include <iostream>
#include <type_traits>
using namespace std;

//工厂
template<class T, class ...ParamTypes>
T* CreateObject(ParamTypes &&...Param)
{
	return new T(std::forward<ParamTypes>(Param)...);
}

//void(*Funcation)(int a, int b, int c);

//最简单的代理(支持多参数代理)
template<class TObjectType,class TReturn,typename...ParamTypes>//对象类型,返回值,可变参数
class FDelegate
{
public:
	FDelegate(TObjectType* InObject, TReturn(TObjectType::* InFuncation)(ParamTypes...))//使用代理时需要传一个对象,因为通过对象调用
		:Object(InObject)//把对象进行初始化
		, Funcation(InFuncation)//函数指针初始化
	{

	}
	TReturn operator()(ParamTypes&&...Params)//重载操作符
	{
		//通过当前对象调用函数指针
		return (Object->*Funcation)(std::forward<ParamTypes>(Params)...);//完美转换,之后把参数传递
	}
private:
	TObjectType *Object;
	TReturn (TObjectType::* Funcation)(ParamTypes...);//声明一个函数指针,通过TObjectType::* Funcation指针调用ParamTypes...任意参
};

//工厂
template<class TObjectType,class TReturn,typename...ParamTypes>
FDelegate<TObjectType, TReturn, ParamTypes...>CreateDelegate(TObjectType* InObject, TReturn(TObjectType::* InFuncation)(ParamTypes...))
{
	return FDelegate<TObjectType, TReturn, ParamTypes...>(InObject, InFuncation);//拷贝是指针的拷贝,内容不会拷贝,如果想拷贝内容需要进行深拷贝
}

学习.cpp

cpp 复制代码
#include <iostream>
#include"advanced.h"

struct FTestA
{

};

struct FTestB
{
	FTestB(int a, int b)
	{

	}
	int print(int a, int b)
	{
		printf("%i %i", a, b);

		return a + b;
	}
};

int main()
{
	FTestA* p = CreateObject<FTestA>();

	FTestB* p2 = CreateObject<FTestB>(1,2);

	auto NewFunction = CreateDelegate(p2, &FTestB::print);

	int a = NewFunction(1, 2);

	cout << "\n" << a << endl;

	return 0;
}
相关推荐
星竹晨L2 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
9ilk2 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
恒者走天下3 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++
阿巴~阿巴~3 小时前
线程局部存储(Thread-Local Storage, TLS)
linux·服务器·开发语言·c++·线程·虚拟地址空间·线程局部存储
杨筱毅4 小时前
【C++】【C++面试】Android SO 体积优化技术点梳理
c++·面试
万能的小裴同学4 小时前
C++ 鸭科夫手柄适配
开发语言·c++·算法
代码AC不AC4 小时前
【C++】哈希表实现 - 链地址法/哈希桶
c++·哈希算法·哈希·哈希桶·链地址法
小杰帅气5 小时前
STL_List简单使用
开发语言·c++·list
清辞8535 小时前
C++数据结构(链表和list)
数据结构·c++·链表
西哥写代码5 小时前
基于dcmtk的dicom工具 第十章 读取dicom文件图像数据并显示
c++·mfc·dcmtk·vs2017