用C++自己实现一个可以接收所有类型的Any类
本文只用于记录所学。
知识点:模板,动态类型转换,继承,多态,智能指针,移动函数相关原理
思路:想要接收所有类型,从题目出发很容易可以想到两种方案,第一是利用模板来接收任意类型的输入输出,第二是可以利用继承多态来实现动态类型的识别。综合利用上述两种思想可以得出如下实现
class Any
{
public:
template <typename T>
Any(T data) : ptr(new Drived<T>(data))
{}
template<typename T>
T cast()
{
auto p=dynamic_cast<Drived<T>*>(ptr.get());
return p->data_;
}
private:
class Base
{
public:
virtual ~Base()=default;
};
template<typename T>
class Drived:public Base
{public:
Drived(T data):data_(data){}
T data_;
};
private:
unique_ptr<Base> ptr;
};
测试代码
int f1()
{
return 123;
}
string f2()
{
return "123";
}
int main()
{
Any r1=f1();
Any r2=f2();
cout << r1.cast<int>() << endl;
cout << r2.cast<string>() << endl;
}
测试结果