在c++ 20下使用微软的proxy库替代传统的virtual动态多态

这篇具有很好参考价值的文章主要介绍了在c++ 20下使用微软的proxy库替代传统的virtual动态多态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

传统的virtual动态多态,经常会有下面这样的使用需求:
#include <iostream>
#include <vector>

// 声明一个包含virtual虚函数的基类
struct shape
{
	virtual ~shape() {}

	virtual void draw() = 0;
};

// 派生,实现virtual虚函数
struct rectangle : shape
{
	virtual void draw() override
	{
		std::cout << "rectangle" << std::endl;
	}
};

// 派生,实现virtual虚函数
struct circle : shape
{
	virtual void draw() override
	{
		std::cout << "circle" << std::endl;
	}
};

int main()
{
	// 由于要用vector容器来保存各种不同的对象,所以这里容器元素的类型只能使用基类指针
	std::vector<shape*> vec;

	vec.emplace_back(new rectangle());
	vec.emplace_back(new circle());

	// 通过virtual动态多态调用,来实现调用真正的对象类型的成员函数
	for (const auto& p : vec)
	{
		p->draw();
	}

	// 输出:
	// rectangle
	// circle
}
上面同样的需求,换成proxy库来实现是这样的:
#include <iostream>
#include <vector>
#include "proxy.h"

// 声明一个代理类,最终会通过这个代理类去调用真正的类对象的成员函数
struct draw : pro::dispatch<void()>
{
	template <class T>
	void operator()(T& self) { self.draw(); }
};

struct shape : pro::facade<draw> {};

// 不需要派生,不需要virtual虚函数
struct rectangle
{
    void draw()
    {
        std::cout << "rectangle"<< std::endl;
    }
};

// 不需要派生,不需要virtual虚函数
struct circle
{
    void draw()
    {
        std::cout << "circle" << std::endl;
    }
};

int main()
{
    // 这里容器元素的类型是个proxy的代理类型
    std::vector<pro::proxy<shape>> shapes;

	shapes.emplace_back(pro::make_proxy<shape>(rectangle()));
	shapes.emplace_back(pro::make_proxy<shape>(circle()));

    // 注意这里的调用方式和virtual动态多态的调用方式不同
    for (auto& p : shapes)
    {
        p.invoke<draw>();
    }

    // 输出:
    // rectangle
    // circle
}

可以看到,换成proxy库之后,不再有virtual虚函数,而且是非侵入式的,我觉得这种方式非常棒,很优雅。至于性能测试,我没有去做。

详情见这个开源仓库地址:https://github.com/microsoft/proxy文章来源地址https://www.toymoban.com/news/detail-669973.html

最后编辑于:2023-08-24

到了这里,关于在c++ 20下使用微软的proxy库替代传统的virtual动态多态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 传统FTP不好用?这个FTP替代方案一定要知道

    FTP(File Transfer Protocol)由于其简单性和广泛的支持,曾经是许多企业进行文件传输的首选协议。然而,随着对安全性要求的提高和新技术的发展,一些企业开始寻求FTP替代方案。 我们来看看哪些企业喜欢或者习惯使用FTP。 网站开发和设计公司 :这些公司需要频繁地上传和下

    2024年04月15日
    浏览(40)
  • Vue3.0里为什么要用 Proxy API 替代 defineProperty API ?

    定义: Object.defineProperty()  方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象 为什么能实现响应式 通过 defineProperty  两个属性, get 及 set get 属性的 getter 函数,当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 th

    2024年03月09日
    浏览(68)
  • Google Earth Engine(GEE) ——AI绘图工具Midjourney能替代传统设计师吗?

    近期智能AI话题爆火,前有ChatGpt,现又出现了一个AI绘图工具Midjourney,号称没有美术基础的人也能快速上手制作出漂亮的图像。也有不少声音表示设计师都要失业了。AI绘图工具能取代设计师吗?你可以参考以下角度来谈谈你的看法。 前言 – 床长人工智能教程 1,你目前从事

    2024年02月09日
    浏览(46)
  • c++ - 抽象类 和 使用多态当中一些注意事项

     在虚函数的后面写上 =0 ,则这个函数为纯虚函数。 纯虚函数不需要写函数的定义,他有类似声明一样的结构。  我们把具有纯虚函数的类,叫做抽象类。 所谓抽象就是,不符合常理的,偶然的,和平常的类不太一样的类。抽象一般是我们人自己想出来的形象,在现实世界

    2024年02月09日
    浏览(36)
  • 微软开源项目Garnet:Redis的竞争者还是替代者?

    对于开源社区,最近的一大新闻就是Redis宣布从7.4版本开始,将采用Redis源代码可用许可证(RSALv2)和服务器端公共许可证(SSPLv1)的双重许可证,取代原有的BSD三条款许可证。这一变化引发了开发者社区的热烈讨论,同时也为微软的新开源项目Garnet带来了更多的关注。那么,

    2024年04月08日
    浏览(41)
  • ubuntu20.04使用微软Azure Kinect DK 实现三维重建demo记录

    本文仅为在ubuntu20.04实现Azure Kinect DK 三维重建demo,此文记录实现过程仅供学习,同时为大家避坑,文中参考大量文章已列至末尾。 1 ros安装 2 安装微软 DK的sdk 3 ros之AzureKinect驱动 4 Azure Kinect DK 点云和RGBD图的获取 5 conda安装 6 Kinect DK 实现三维重建 1.1 安装源,添加sources.list 1

    2024年02月07日
    浏览(66)
  • C++20新版本特性—编译时多态

    本章介绍如何使用C++进行编译时多态机制,编译时多态相比于运行时多态,会节省运行时的开销。 2.1 函数重载机制 在C语言中除了static函数以外,不支持同名函数,再加上没有名称空间的概念,因此程序员将多个编译单元链接在一起的时候,若出现同名函数将导致链接重定义

    2024年01月23日
    浏览(41)
  • Redis 又双叒叕改开源协议了,微软提前推出高性能替代方案 Garnet

    3 月 20 号,Redis 商业公司 CEO Rowan Trollope 在公司官方博客上宣布了一项重大变革。Redis 核心软件将从 BSD 3-Clause 许可证过渡到双重许可证模式,这一变化将从 Redis v7.4 版本开始,贯穿到未来所有的 Redis 发布版本。新的许可证模式使用了 Redis Source Available License version 2 (RSALv2) 或

    2024年04月16日
    浏览(41)
  • 20.1K Star!Notion的开源替代方案:AFFiNE

    Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记。今天给大家推荐一个最近比较火的开源替代方案:AFFiNE。目前该开源项目已经斩获20.1K Star,热度非常的高,下面一起来认识一下这个继Notion之后,被热捧的开源软件吧。

    2024年02月16日
    浏览(44)
  • 【C++】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout

    author:Carlton tag:C++ topic:【C++】多态原理剖析,Visual Studio开发人员工具使用查看类结构cl /d1 reportSingleClassLayout website:黑马程序员C++ tool:Visual Studio 2019 date:2023年7月24日   目录 父类使用虚函数前后类内部结构变化 子类重写父类虚函数的作用及其机理         首先父类成员

    2024年02月15日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包