c++实现Any类,让一个类型指向其他任意类型

文章介绍了如何在C++中设计一个Any类,用于存储不同类型的数据,通过模板和dynamic_cast实现类型安全的存储和数据获取。它提供了一个模板构造函数接收任意类型数据,并有一个公共函数进行类型转换。
摘要由CSDN通过智能技术生成

  在c++中,对于以上任务,容易想到的是一个基类类型指向其所有派生类。因此设计一个Any类,其里面有一个成员基类Base类,其派生类可以是数据date,但是你不知道date到底是什么东西,所以需要使用模版。所以其结构为:

class Any
{
private:
	class Base
	{
	public:
		virtual ~Base() = deafult;	
	}
	template<typename T>
	class Derive: public Base
	{
	public:
		Derive(T data):m_data(data);
		T m_data;
	}
private:
	std::unique_ptr<Base> m_base; 
}

  之后将数据赋值给Any类。以下如下:

Any(T data):m_base(std::make_unique<Derive<T>>(data)){}

  还需要一个public公有函数将数据类型取出来。

template<typename T>
T cast_()
{
	Derive<T>* pd = dynamic_cast<Derive<T>*>(m_base.get());
	if(pd == nullptr)
	{
		throw "数据类型不匹配"}
	return pd->m_data;
}

完整代码:

class Any
{
public:
	Any() = default;
	~Any() = default;
	Any(const Any&) = delete;
	Any& operator=(const Any&) = delete;
	Any(Any&&) = default;
	Any& operator=(Any&&) = default;

	//模版构造函数,可以接受任意类型数据,并将其存储在派生类当中
	template<typename T>
	Any(T data) :m_base(std::make_unique<Derive<T>>(data))
	{

	}

	template<typename T>
	T cast_()
	{
		//通过dynamic_cast将基类指针转化为派生类,进而获取数据
		Derive<T>* pd = dynamic_cast<Derive<T>*>(m_base.get());//m_base.get()返回指向base类对象的原始指针
		if (pd == nullptr)
		{
			throw "type is unmatch";
		}
		return pd->m_data;
	}
private:
	class Base
	{
	public:
		virtual ~Base() = default;
	};
	template<typename T>
	class Derive : public Base
	{
	public:
		Derive(T data) :m_data(data) {}
		T m_data;
	};
private:
	std::unique_ptr<Base> m_base;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值