#ifndef DOSSIER_MOVE_BY_COPY_H #define DOSSIER_MOVE_BY_COPY_H #include namespace util { /* * When a copy is made, it moves the object * This allows you to move an object when a move can't be done. */ template class MoveByCopy { public: typedef T move_type; private: move_type _to_move; public: explicit MoveByCopy(move_type &&to_move) : _to_move(std::move(to_move)) { } MoveByCopy(MoveByCopy &&other) = default; MoveByCopy(const MoveByCopy &other) { *this = other; } MoveByCopy& operator=(MoveByCopy &&other) = default; MoveByCopy& operator=(const MoveByCopy &other) { this->_to_move = std::move(const_cast(other)._to_move); return *this; } operator move_type() { return std::move(_to_move); } }; template MoveByCopy cmove(T &movable) { return MoveByCopy(std::move(movable)); } // Do NOT use this unless you are absolutely certain the object to be moved is no longer used by the caller template MoveByCopy const_cmove(const T &movable) { return MoveByCopy(std::move(const_cast(movable))); } } #endif