实习的第一天:
昨天是我实习的第一天,有个大哥带我学到了许多,今天分享一下收获。
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