Commit cee544e6e420282beb477da0ca219fd05a1adaab
1 parent
0ce72890
Added emplace_back
Showing
1 changed file
with
28 additions
and
1 deletions
examples11/04-vectortmpl/vector.h
... | ... | @@ -134,10 +134,37 @@ public: |
134 | 134 | return o; |
135 | 135 | } |
136 | 136 | |
137 | - void push_back(const C &s) { | |
137 | + template <class... Args> C &emplace_back(Args &&... args) { | |
138 | + // cout << "emplace_back" << endl; | |
139 | + resize_before_push(); | |
140 | + new (data + size) C(std::forward<Args>(args)...); | |
141 | + ++size; | |
142 | + return *(data + size); | |
143 | + } | |
144 | + | |
145 | +#if 1 | |
146 | + C &push_back(C &&s) { | |
147 | + // cout << "push_back with rvalue argument" << endl; | |
148 | + resize_before_push(); | |
149 | + new (data + size) C(std::move(s)); | |
150 | + ++size; | |
151 | + return *(data + size); | |
152 | + } | |
153 | + | |
154 | + C &push_back(const C &s) { | |
155 | + // cout << "push_back with reference argument" << endl; | |
138 | 156 | resize_before_push(); |
139 | 157 | new (data + size) C(s); |
140 | 158 | ++size; |
159 | + return *(data + size); | |
160 | + } | |
161 | +#else | |
162 | + template <class T> C &push_back(T &&s) { | |
163 | + resize_before_push(); | |
164 | + new (data + size) C(std::forward<T>(s)); | |
165 | + ++size; | |
166 | + return *(data + size); | |
141 | 167 | } |
168 | +#endif | |
142 | 169 | }; |
143 | 170 | #endif /* __VECTOR_H__ */ | ... | ... |