🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
ScopedPtr.hpp
浏览该文件的文档.
1
20
21#pragma once
22
23#include "AstGlobal.h"
24#include <type_traits> // for std::enable_if
25#include <cstdio>
26
27AST_NAMESPACE_BEGIN
28
29
30template<typename T, typename = void>
32{
33 static void cleanup(T* ptr)
34 {
35 delete ptr;
36 }
37};
38
39template<typename T>
40struct ScopedPtrDeleter<T, typename std::enable_if<std::is_base_of<Object, T>::value>::type>
41{
42 static void cleanup(T* ptr)
43 {
44 ptr->destruct();
45 }
46};
47
48template<>
49struct ScopedPtrDeleter<std::FILE>
50{
51 static void cleanup(std::FILE* ptr)
52 {
53 fclose(ptr);
54 }
55};
56
63template<typename T>
65{
66public:
67 ScopedPtr(T* ptr)
68 :pointer_{ ptr }
69 { }
70 ScopedPtr()
71 :pointer_{ nullptr }
72 {}
73 ScopedPtr(std::nullptr_t)
74 :pointer_{ nullptr }
75 {
76 }
79 :pointer_{ other.pointer_ }
80 {
81 other.pointer_ = nullptr;
82 }
85 {
86 std::swap(pointer_, other.pointer_);
87 return *this;
88 }
89 ScopedPtr& operator=(T* ptr)
90 {
91 this->reset(ptr);
92 return *this;
93 }
94 ~ScopedPtr()
95 {
96 this->_delete();
97 }
98 void reset(T* ptr)
99 {
100 auto oldPtr = pointer_;
101 pointer_ = ptr;
102 this->_delete(oldPtr);
103 }
105 void reset()
106 {
107 this->reset(nullptr);
108 }
109 T* get() const
110 {
111 return pointer_;
112 }
113 T* operator->() const{return pointer_;}
114 operator T*() const{return pointer_;}
115
119 {
120 T* ptr = pointer_;
121 pointer_ = nullptr;
122 return ptr;
123 }
124private:
125 ScopedPtr(const ScopedPtr&) = delete;
126 ScopedPtr& operator =(const ScopedPtr&) = delete;
127 void _delete()
128 {
129 this->_delete(pointer_);
130 }
131 void _delete(T* ptr)
132 {
133 if(ptr)
134 ScopedPtrDeleter<T>::cleanup(ptr);
135 }
136protected:
137 T* pointer_{nullptr};
138};
139
140AST_NAMESPACE_END
141
作用域指针类
定义 ScopedPtr.hpp:65
ScopedPtr(ScopedPtr &&other)
移动构造函数
定义 ScopedPtr.hpp:78
ScopedPtr & operator=(ScopedPtr &&other)
移动赋值运算符
定义 ScopedPtr.hpp:84
T * release()
释放绑定:取消对本指针所接管对象的所有权
定义 ScopedPtr.hpp:118
void reset()
释放所接管对象所有权并置空指针
定义 ScopedPtr.hpp:105
Unit T
特斯拉
定义 Unit.cpp:492
定义 ScopedPtr.hpp:32