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