any类的实现

实习的第一天:
昨天是我实习的第一天,有个大哥带我学到了许多,今天分享一下收获。

  7 
  8 #include<iostream>
  9 #include<typeinfo>
 10 #include<memory>
 11 using namespace std;
 12 
 13 class Base{	//对外调用的接口,抽象类
 14 public:
 15     Base(){
 16 
 17     }
 18     virtual Base* clone() = 0;
 19     virtual const type_info& get_type() = 0;
 20     virtual ~Base(){
 21 
 22     }
 23 };
 24 
 25 template<typename T>	//模板类,之所以使用模板,是为了自动推导数据的类型和保存数据
 26 class Derived:public Base{	// 子类,实现父类中的接口
 27 public:
 28     T data;		//保存的数据
 29     const type_info& type;		//数据对应的typeid()
 30 public:
 31     Derived(T data):data(data),type(typeid(data)){	//构造函数,初始化数据和typeid
 32     }
 33     Base* clone(){	//主要用于拷贝构造时,返回拷贝对象的内容
 34         return new Derived<T>(data);
 35     }
 36     const type_info& get_type(){	//得到typeid
 37         return type;
 38     }
 39     ~Derived(){
 40     }
 41 };
 42 
 //any类能够自动推导其所对应的数据
 //但auto是个关键子,而any是个通用的封装好的类,且可以存储数据的信息
 43 class any{	
 44 private:
 45     shared_ptr<Base> base;	//多态 能够通过指针来调用实现的接口
 46 public :
 47 
 48     any(){	//空构造
 49     }
 50     template<typename T>	//带参构造 
 51     any(const T& value){
 52         base = make_shared<Derived<T> >(value);   //保存数据  
 53     }
 54 
 55     any(const any& a):base(a.base->clone()){
 56 
 57     }
 58 
 59     template<typename T>	//赋值
 60     any& operator=(const T& value){
 61         any mid(value);
 62         base = mid.base;
 63         mid.base = nullptr;
 64         return *this;
 65     }
 66 
 67     bool has_value(){	//判断是否有直
 68         return base != nullptr;
 69     }
 70 
 71     const type_info& type(){	//得到typeid
 72         return base->get_type();
 73     }
 74 
 75     bool type_cmp(const any& a){	//判断类型是否相同
 76         return base->get_type() == a.base->get_type();
 77     }
 78     template<typename T>	//得到值的地址
 79     T* value_dest(){
 80         Derived<T> *p = dynamic_cast<Derived<T> >(base);
 81         return p?&p->data:nullptr;
 82     }
 83 
 84     template<typename T>	//得到直
 85     T& value(){
 86         return (dynamic_cast<Derived<T>& >(base)).data;
 87     }
 88 
 89 
 90 };
 91 
 92 int main(){
 93     any a;
 94     cout << "a是否有直"<< boolalpha << a.has_value() << endl;
 95     a = 2;
 96     cout << "a是否有直"<< boolalpha << a.has_value() << endl;
 97     cout << "a的类型为:" << a.type().name() << endl;
 98     any b(4.12);
 99     return 0;
100 }
101 
102 
103 
                                                                                                                   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值