[C++] 实现Union

news/2025/2/18 10:08:25/

前几天学了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次&…