05 Any上帝类实现

C++17引入的Any类允许存储和操作任意类型的值,通过模板构造函数接收不同类型数据并使用派生类动态存储。cast_()方法利用dynamic_cast进行类型转换,确保类型安全。当类型不匹配时,会抛出异常。
摘要由CSDN通过智能技术生成

        因为我们需要得到线程执行完成后的结果,这个结果可能有不同类型的值,需要一个可以操作不同类型值的方法,C++17引入的Any类似java和python的object类,它是所有类型的基类,可以用来存储和操作任意类型的值。

Any 类具有以下特点和功能:

  • 构造函数:Any 类提供了一个模板构造函数 Any(T data),用于接收任意类型的数据并存储在 Any 对象中。(不同类型的数据作为派生类的一个成员变量)

  • 该构造函数通过使用派生类 Derive<T> 来存储不同类型的数据,并将其保存在 base_ 成员变量中。这样做的好处是可以根据实际存储的数据类型动态选择对应的派生类,并实现类型安全的存储。

  • cast_() 方法:Any 类提供了一个模板方法 cast_(),用于从 Any 对象中提取存储的数据并进行类型转换。该方法使用 dynamic_castbase_ 成员指针转换为相应的派生类指针,然后访问派生类中的 data_ 成员变量,并将其转换为指定的目标类型 T。如果类型不匹配,将抛出异常。
// Any类型:可以接收任意数据的类型  C++17
class Any
{
public:
	Any() = default;
	~Any() = default;
	Any(const Any&) = delete;
	Any& operator=(const Any&) = delete;

	Any(Any&&) = default;
	Any& operator=(Any&&) = default;

	// 这个构造函数可以让Any类型接收任意其它的数据
	template<typename T>  // T:int    Derive<int>
	Any(T data) : base_(std::make_unique<Derive<T>>(data))
	{}

	// 这个方法能把Any对象里面存储的data数据提取出来  (Any类型转具体类型)
	template<typename T>
	T cast_()
	{
		// 我们怎么从base_找到它所指向的Derive对象,从它里面取出data成员变量
		// 基类指针 =》 派生类指针   RTTI
		// base_.get() 获取智能指针的裸指针
        // dynamic_cast 不能直接使用智能指针的类型 只能在指针之间转换
		Derive<T>* pd = dynamic_cast<Derive<T>*>(base_.get());
		if (pd == nullptr)
		{
			throw "type is unmatch!";
		}
		return pd->data_;
	}
private:
	// 基类类型
	class Base
	{
	public:
		virtual ~Base() = default; //default 使用默认实现
	};

	// 派生类类型
	template<typename T>
	class Derive : public Base
	{
	public:
		Derive(T data) : data_(data)
		{}
		T data_;  // 保存了任意的其它类型
	};

private:
	// 定义一个基类的指针
	std::unique_ptr<Base> base_;
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值