[C++] 实现Union

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

cpp 复制代码
#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 new
		new (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;
}
相关推荐
布莱克60511 分钟前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
沫璃染墨5 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互
xiaoye-duck6 小时前
《C++ 项目:手写大模型接入 SDK》DeepSeek接口设计(下):流式响应实现和测试
开发语言·网络·c++·语言模型
旖旎夜光7 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
小超人诞生日记8 小时前
C++ 智能指针的使用及其原理详解
c++·算法
akinggw9 小时前
libagentcore - 一个基于c++的AI多agent系统升级到2.0版本
开发语言·jvm·c++
繁星蓝雨9 小时前
C++设计原理———多重继承(虚基类、菱形继承、委托、重命名、基类和成员初始化)
c++·委托·多重继承·mi·显式初始化列·虚基类·对象布局
旖旎夜光10 小时前
【C++ 基础入门】命名空间、输入输出、缺省参数与函数重载
开发语言·c++·笔记·学习
扶尔魔ocy11 小时前
【QT入门到晋级】用开源的自定义控件开发
c++·qt·自定义控件
akinggw12 小时前
libsherpacore - 基于 sherpa-onnx 的 C++ 语音交互静态库
c++·交互·语音识别