В C ++ 11 есть много характеристик, позволяющих узнать, безопасно ли выполнять битовые операции.
В вашем случае, я думаю, вам следует использовать std::is_trivially_move_constructible<T>
,Эти черты реализованы с использованием встроенных функций компилятора (непереносимых, поэтому он находится в стандартной библиотеке), но сами они переносимы.
Поэтому код должен быть похож на:
template <typename T>
void move_to(T* storage, T* begin, T* end) {
if (std::is_trivially_move_constructible<T>::value) {
memmove(storage, begin, (end - begin) * sizeof(T));
} else {
for (; begin != end; ++begin, ++storage) {
new (storage) T(std::move(*begin));
}
}
}
И компилятор оптимизирует if
во время компиляции в зависимости от того, является ли тип тривиально перемещаемым, конструктивным или нет, и покидает только интересную ветвь.