Стандартная библиотека предлагает несколько алгоритмов на основе копий. Некоторые из них, например<std::copy
>или<std::uninitialized_copy
>, являются основными строительными блоками для контейнеров и других структур данных. Эта библиотека предлагает функции на основе перемещения для этих целей:
template<typename I, typename O> O move(I, I, O);
template<typename I, typename O> O move_backward(I, I, O);
template<typename I, typename F> F uninitialized_move(I, I, F);
template<typename I, typename F> F uninitialized_copy_or_move(I, I, F);
Первые 3 представляют собой вариации алгоритмов эквивалентных копий, но назначение копий и построение копий заменяются назначением и конструкцией перемещения. Последняя имеет такое же поведение, как и<std::uninitialized_copy
>, но поскольку несколько реализаций стендовой библиотеки не очень хорошо работают с<move_iterator
>, эта версия является портативной версией для тех, кто хочет использовать итераторы перемещения.
#include "movable.hpp"
#include <boost/move/algorithm.hpp>
#include <cassert>
#include <boost/aligned_storage.hpp>
int main()
{
const std::size_t ArraySize = 10;
movable movable_array[ArraySize];
movable movable_array2[ArraySize];
boost::move(&movable_array2[0], &movable_array2[ArraySize], &movable_array[0]);
assert(movable_array2[0].moved());
assert(!movable_array[0].moved());
boost::move_backward(&movable_array[0], &movable_array[ArraySize], &movable_array2[ArraySize]);
assert(movable_array[0].moved());
assert(!movable_array2[0].moved());
boost::aligned_storage< sizeof(movable)*ArraySize
, boost::alignment_of<movable>::value>::type storage;
movable *raw_movable = static_cast<movable*>(static_cast<void*>(&storage));
boost::uninitialized_move(&movable_array2[0], &movable_array2[ArraySize], raw_movable);
assert(movable_array2[0].moved());
assert(!raw_movable[0].moved());
return 0;
}