
On 8/3/2013 2:00 AM, Andrew Ho wrote:
Hi,
I implemented std::unique_ptr using C++03 features plus a few other Boost Libraries. Incidentally, I also implemented default_delete (which binds to std::default_delete if available) because it's required for unique_ptr.
I never participated much in the discussion of Boost.Move, so I don't know if this emulation approach was ever discussed, but once upon a time I developed my own technique to simulate move-only types in C++03. I never did anything with this technique when I first discovered it (about 10 years ago now), and indeed completely forgot about it until now. Not extensively tested. Might miss important corner cases ... template<typename T> struct unique_ptr; template<typename T> struct unique_ptr_ref { explicit unique_ptr_ref(T *p) : p_(p) {} private: friend struct unique_ptr<T>; T *p_; }; template<typename T> struct unique_ptr { unique_ptr() : p_(0) {} explicit unique_ptr(T *p) : p_(p) {} unique_ptr(unique_ptr_ref<T> r) : p_(r.p_) {} ~unique_ptr() { delete p_; } operator unique_ptr_ref<T>() { unique_ptr_ref<T> r(p_); p_ = 0; return r; } T *operator->() const { return p_; } T &operator*() const { return *p_; } private: unique_ptr(unique_ptr &); // param must be non-const ref unique_ptr &operator=(unique_ptr const &); T *p_; }; template<typename T> unique_ptr<T> make_unique() { return unique_ptr<T>(new T); } template<typename T> unique_ptr<T> move(unique_ptr<T> &p) { return unique_ptr<T>(static_cast<unique_ptr_ref<T> >(p)); } int main() { unique_ptr<int> p = make_unique<int>(); //unique_ptr<int> no = p; // <== ERROR unique_ptr<int> yes = move(p); // <== OK } -- Eric Niebler Boost.org http://www.boost.org