1
+ #pragma once
2
+ #include < iostream>
3
+ #include < unordered_set>
4
+ namespace user {
5
+ // 类模板与函数模板声明部分
6
+ template <typename T>
7
+ class unique_ptr ; // 定义类模板unique_ptr
8
+ template <typename T>
9
+ class unique_ptr <T[]>; // 定义特化unique_ptr<T[]>
10
+ template <typename T>
11
+ void swap (unique_ptr<T>&, unique_ptr<T>&);
12
+ template <typename T>
13
+ std::ostream& operator <<(std::ostream&, const unique_ptr<T>&);
14
+ // 主模板定义部分
15
+ template <typename T>
16
+ class unique_ptr { // 分配动态单对象,使用unique_ptr<T>语法
17
+ public:
18
+ using pointer = T*; // 通过using定义成员类型pointer,公有
19
+ using element_type = T; // 定义成员类型element_type
20
+ private:
21
+ pointer _ptr {nullptr }; // pointer类型的私有成员,成员类型pointer必须定义在前面
22
+ static std::unordered_set<pointer> record;
23
+ public:
24
+ explicit unique_ptr (pointer = {nullptr }); // 接收pointer类参数,或nullptr
25
+ unique_ptr (const unique_ptr&) = delete ; // 删除拷贝构造函数
26
+ ~unique_ptr (); // 析构函数
27
+ unique_ptr& operator =(const unique_ptr&) = delete ; // 删除拷贝赋值函数
28
+ pointer release (); // release函数会把指向改为nullptr
29
+ pointer get ()const ; // get函数不会改变成员;至于透过get()改变内容,那是允许的
30
+ void reset (pointer = {nullptr }); // 重置指向
31
+ operator bool ()const { return _ptr != nullptr ; } // 表明指向是否非空
32
+ void swap (unique_ptr&);
33
+ element_type& operator *()const { return *get (); } // 注意返回值得是引用
34
+ pointer operator ->()const { return get (); } // 注意返回类型得是裸指针或对象
35
+ template <typename U>
36
+ friend void swap (unique_ptr<U>&, unique_ptr<U>&);
37
+ template <typename U>
38
+ friend std::ostream& operator <<(std::ostream&, const unique_ptr<U>&);
39
+ };
40
+ // 模板特化定义部分
41
+ template <typename T>
42
+ class unique_ptr <T[]> { // 特化,分配动态数组,使用unique_ptr<T[]>语法
43
+ public:
44
+ using pointer = T*; // 对于T[]来说,它只是意味着分配动态数组,其指针类型还是T*
45
+ using element_type = T; // 同理,元素类型还是T
46
+ private:
47
+ pointer _ptr {nullptr };
48
+ static std::unordered_set<pointer> record;
49
+ public:
50
+ explicit unique_ptr (pointer = {nullptr });
51
+ unique_ptr (const unique_ptr&) = delete ; // 删除拷贝构造函数
52
+ ~unique_ptr ();
53
+ unique_ptr& operator =(const unique_ptr&) = delete ; // 删除拷贝赋值函数
54
+ pointer release (); // 同上
55
+ pointer get ()const ;
56
+ void reset (pointer = {nullptr }); // 简化版,对继承关系的支持较差
57
+ operator bool ()const { return _ptr != nullptr ; }
58
+ void swap (unique_ptr&);
59
+ element_type& operator [](std::size_t i)const { return _ptr[i]; }
60
+ // 下标运算符,访问第i个元素
61
+ template <typename U>
62
+ friend void swap (unique_ptr<U>&, unique_ptr<U>&);
63
+ template <typename U>
64
+ friend std::ostream& operator <<(std::ostream&, const unique_ptr<U>&);
65
+ };
66
+ };
67
+ // 静态成员变量定义部分
68
+ template <typename T>
69
+ inline std::unordered_set<
70
+ typename user::unique_ptr<T>::pointer // typename关键字说明它是一个类型
71
+ > user::unique_ptr<T>::record;
72
+ template <typename T>
73
+ inline std::unordered_set<
74
+ typename user::unique_ptr<T[]>::pointer
75
+ > user::unique_ptr<T[]>::record;
76
+ #include " Definition.tpp"
0 commit comments