[C++] 实现Union

news/2024/4/20 23:48:18/

前几天学了replacement new写的小玩意

#include <iostream>
#include <functional>
#include <string>// 可能因为const char*类型的缘故
// 用const ArgsT&&...会报错// 测试用类
struct Test
{Test(){std::cout << "constructed" << std::endl;};~Test(){std::cout << "destructed" << std::endl;};
};// 析构器
template <typename T = char[]>
struct Destructor
{void operator()(void *ptr){T *obj = (T *)ptr;// 调用析构函数obj->~T();};
};// 基础类型没有析构函数
#define BASE_TYPE(type)            \template <>                    \struct Destructor<type>        \{                              \void operator()(void *) {} \};BASE_TYPE(char[]);
BASE_TYPE(int);//构造器
template <typename T>
struct Constructor
{template <typename... ArgsT>void operator()(void *ptr, ArgsT... args){T *obj = (T *)ptr;// replacement newnew (obj) T(std::forward<ArgsT>(args)...);};
};// 变体类
template <std::size_t size>
struct Variant
{char memory[size] = {};std::function<void(void *)> destructor = Destructor<>();// 调用对象的析构函数~Variant(){destructor(memory);destructor = Destructor<>();}// 构造对象template <typename NewT, typename... ArgsT>void construct(ArgsT... args){destructor(memory);destructor = Destructor<NewT>();Constructor<NewT> c;c(memory, std::forward<ArgsT>(args)...);}// 获取对象template <typename T>T &get(){T *obj = (T *)memory;return *obj;}template <typename T>const T &get() const{const T *obj = (const T *)memory;return *obj;}
};int main(int argc, char *argv[])
{// 测试/*Destructor<Test> d;Test t;d(&t);Constructor<Test> c;c(&t);*/// 使用例Variant<32> v;v.construct<Test>();v.construct<std::string, std::string>("aaa");std::cout << v.get<std::string>() << std::endl;v.construct<int, int>(666);std::cout << v.get<int>() << std::endl;return 0;
}

http://www.ppmy.cn/news/1389735.html

相关文章

前端生成绘制一个验证码,并验证

先上效果&#xff1a; 这里是前端生成的验证码&#xff0c;如果需要请求后端把随机数改为接口就好了。 使用的是vantUI的弹窗&#xff0c;当然核心还是canvas。我将它封装成组件了直接上代码&#xff1a; <template><div class"component"><van-dia…

机器学习模型—K means

文章目录 机器学习模型—K means聚类的目标k 均值原理k 均值 的实现手动实现Python 实现K 的确定 手肘法总结机器学习模型—K means K-Means 聚类是一种无监督机器学习算法,它将未标记的数据集分为不同的簇。本文旨在探讨 k 均值聚类的基本原理和工作原理以及实现。 无监督机…

一种仿物化视图技术的报表查询优化方案

报表查询&#xff0c;懂得都懂&#xff0c;具有大数据量&#xff0c;多表关连&#xff0c;计算维度多&#xff0c;单纯SQL关连查询统计慢&#xff0c;领导关注度高等特点。在本人接触的项目中&#xff0c;一般对实时性的要求可以适当滞后。针对上述特点&#xff0c;本人从已开发…

八股文三(Spring、Spring Cloud Alibaba)

Spring篇 什么是Spring Spring是个轻量级的框架&#xff0c;他有两大内核分别是IOC、AOPIOC是什么 * 依赖注入和控制反转&#xff0c;它是一种思想&#xff0c;创建对象不是直接new出来&#xff0c;而是交给IOC容器&#xff0c;由容器去创建进行管理&#xff0c;这就是控制反…

1058:求一元二次方程

【题目描述】 利用公式 求一元二次方程axbxc0的根&#xff0c;其中a不等于0。结果要求精确到小数点后5位。 【输入】 输入一行&#xff0c;包含三个浮点数a,b,c&#xff08;它们之间以一个空格分开&#xff09;&#xff0c;分别表示方程axbxc0的系数。 【输出】 输出一行&…

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

效果 工程代码说明 源码运行环境为Vs2017+Qt5.12.4,sip部分由eXosip库完成。主要功能为模拟GB28181客户端,完成客户端向服务端注册、注销、发送保活心跳、响应服务端的"设备信息查询"及"目录查询"等功能。 源码 #include <QtWidgets/QApplication>…

【机器学习】TinyML的介绍以及在运动健康领域的应用

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

在centos8中部署Tomcat和Jenkins

参考链接1&#xff1a;tomcat安装和部署jenkins_jenkins和tomcat-CSDN博客 参考链接2&#xff1a;--配置开机启动tomcat文件 x​​​​​​超详细&#xff1a;Centos8安装Tomcat并配置开机自动启动_centos设置tomcat开机自启-CSDN博客文章浏览阅读4.4k次&#xff0c;点赞4次&…

OKR如何与组织的整体战略和计划相结合?

OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;作为一种流行的目标管理方法&#xff0c;正逐渐成为组织实现战略目标的重要手段。本文将探讨OKR如何与组织的整体战略和计划相结合&#xff0c;从而推动组织的持续发展。 首先&#xff0c;我…

蓝桥杯刷题|01入门真题

[蓝桥杯 2020 省 AB1] 解码 题目描述 小明有一串很长的英文字母&#xff0c;可能包含大写和小写。 在这串字母中&#xff0c;有很多连续的是重复的。小明想了一个办法将这串字母表达得更短&#xff1a;将连续的几个相同字母写成字母 出现次数的形式。 例如&#xff0c;连续…

macOS - 获取硬件设备信息

文章目录 1、CPU获取方式 一&#xff1a; system_profiler获取方式二&#xff1a;sysctl&#xff0c; machdepmachdep 2、内存3、硬盘4、显卡5、声卡6、光驱7、系统序列号8、型号标识符9、UUID 等信息 10. 计算机名称 1、CPU 获取方式 一&#xff1a; system_profiler % syst…

Java实现知乎热点小时榜爬虫

1.效果演示 1.1 热点问题列表 启动程序后&#xff0c;自动展示热点问题&#xff0c;并等待终端输入 1.2 根据序号选择想看的热点问题 输入问题序号&#xff0c;展示回答内容 1.3 退出 输入q即可退出程序 2.源码 2.1 pom.xml <?xml version"1.0" enco…

JAVA 100道题(6)

6.创建一个表示矩形的类&#xff0c;包括宽度和高度属性&#xff0c;以及计算面积和周长的方法。 下面是一个简单的Python类&#xff0c;表示矩形&#xff0c;包含宽度和高度属性&#xff0c;以及计算面积和周长的方法&#xff1a; python复制代码 class Rectangle: def __ini…

学习笔记-华为IPD转型2020:3,IPD的实施

3. IPD的实施 1999 年开始的 IPD 转型是计划中的多个转型项目中的第一个&#xff08;Liu&#xff0c;2015&#xff09;。华为为此次转型成立了一个专门的团队&#xff0c;从大约20人开始&#xff0c;他们是华为第一产业的高层领导。董事会主席孙雅芳是这个团队的负责人。该团…

【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

本文通过docker-compose构建一个单体的rabbtimq容器。 1&#xff0c;docker、docker-compose环境 首先需要有docker和docker-compose环境&#xff0c;docker安装[1]&#xff0c;docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 [root192 ge…

踏“时间”与“空间”前来探寻复杂度的奥妙(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

【机器学习系列】M3DM工业缺陷检测部署与训练

一.基础资料 1.Git 地址 地址 2.issues issues 3.参考 参考 csdn 二.服务器信息 1.GPU 服务器 GPU 服务器自带 CUDA 安装(前提是需要勾选上)CUDA 需要选择大于 11.3 的版本登录服务器后会自动安装 GPU 驱动 2.CUDA 安装 GPU 服务器自带 CUDA CUDA 版本查看 3.登录信…

什么是零日攻击?

一、零日攻击的概念 零日攻击是指利用零日漏洞对系统或软件应用发动的网络攻击。 零日漏洞也称零时差漏洞&#xff0c;通常是指还没有补丁的安全漏洞。由于零日漏洞的严重级别通常较高&#xff0c;所以零日攻击往往也具有很大的破坏性。 目前&#xff0c;任何安全产品或解决方案…

蓝桥杯第14届模拟赛最大连通分块(dfs)

问题描述(答案148)   小蓝有一个 30 行 60 列的数字矩阵&#xff0c;矩阵中的每个数都是 0 或 1 。 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 001011101000100011111111111010000010010…

GIS学习

匹配查询&#xff0c;先连接两个表&#xff0c;然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…