因为我们需要得到线程执行完成后的结果,这个结果可能有不同类型的值,需要一个可以操作不同类型值的方法,C++17引入的Any类似java和python的object类,它是所有类型的基类,可以用来存储和操作任意类型的值。
Any
类具有以下特点和功能:
- 构造函数:
Any
类提供了一个模板构造函数Any(T data)
,用于接收任意类型的数据并存储在Any
对象中。(不同类型的数据作为派生类的一个成员变量)
- 该构造函数通过使用派生类
Derive<T>
来存储不同类型的数据,并将其保存在base_
成员变量中。这样做的好处是可以根据实际存储的数据类型动态选择对应的派生类,并实现类型安全的存储。
cast_()
方法:Any
类提供了一个模板方法cast_()
,用于从Any
对象中提取存储的数据并进行类型转换。该方法使用dynamic_cast
将base_
成员指针转换为相应的派生类指针,然后访问派生类中的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_;
};