背景
问题一:怎么设计run
函数的返回值,可以表示任意类型
问题二:如何设置执行任务获得的Result
类型,以及通过Result::get()
能够获取任务执行结果,同时任务未执行完成时会在get()
处阻塞住。
实现分析
因为Any
类型需要接受任意类型,故使用到模板;
需要让一个类型指向其他任意类型,用基类类型可以指向派生类类型
代码实现
// 可以接受任意数据类型的类型
class Any
{
public:
Any() = default;
~Any() = default;
Any(const Any&) = delete;
// 左值拷贝构造和赋值应该删除,因为unique_ptr不支持
Any& operator=(const Any&) = delete;
Any(Any&&) = default;
Any& operator=(Any&&) = default;
// 要点2:这个类型有一个能接受任意类型参数的构造函数,存在内部的派生类中
template<typename T>
Any(T data) : base_(std::make_unique<Derive<T>>(data)) {
}
// 要点3:提取出Any对象的具体数据
template<typename T>
T cast_()
{
// 基类转派生类指针 RTTI转换
Derive<T>* pd = dynamic_cast<Derive<T>*>(base_.get());
if (pd == nullptr)
{
throw "type is incompatible!";
}
return pd->data_;
}
private:
class Base
{
public:
virtual ~Base() = default;
};
// 要点1
template<typename T>
class Derive : public Base
{
public:
Derive(T data) : data_(data) {
}
T data_;
};
private:
std::unique_ptr<Base> base_;
};