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,10 +134,37 @@ public: | ||
134 | return o; | 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 | resize_before_push(); | 156 | resize_before_push(); |
139 | new (data + size) C(s); | 157 | new (data + size) C(s); |
140 | ++size; | 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 | #endif /* __VECTOR_H__ */ | 170 | #endif /* __VECTOR_H__ */ |