c++11实现将任意类型数据与Any类型之间的相互转换
原理
- 父类对象可以通过指针指向子类对象
- 子类可以拿来封装一个模板类型的数据
因此,可以定义一个Any类,Any类里的数据成员是一个base类型的指针,而在Any类的构造函数里,我们可以将一个任意类型的数据包装成一个继承自base类的类指针,这样就实现了将任意数据转换为Any类型
#ifndef ANY_H
#define ANY_H
#include<memory>
class Any{
public:
/*
父类指针指向子类对象
子类封装任意类型的数据
从而实现将任意类型的数据转换为base指针类型
*/
template<typename T>
Any(T data):_base(std::make_unique<Derive<T>>(data)){};
~Any()=default;
/*
std::unique_ptr不能被拷贝,因此该类理论上也不能被拷贝,只可以被移动
*/
Any(const Any&)=delete;
Any(Any&&)=default;
Any& operator=(const Any&)=delete;
Any& operator=(Any&&)=default;
/*
将base类型转换为对应的数据类型
*/
template<typename T>
T cast()
{
Derive<T>* derivtPtr=dynamic_cast<Derive<T>*>(_base.get());
if(!derivtPtr)
{
throw "data type is unmatch!";
}
return derivtPtr->_data;
}
private:
class Base
{
public:
Base()=default;
virtual ~Base()=default;
};
template<typename T>
class Derive:public Base{
public:
Derive(T data):_data(data){};
~Derive()=default;
T _data;
};
std::unique_ptr<Base> _base;
};
#endif
原文地址:https://blog.csdn.net/qq_58158950/article/details/140594872
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!