支持复制构造的对象与不支持复制构造的对象之间的通用C ++复制

时间:2017-10-31 18:16:30

标签: c++ c++11 copy-constructor move-semantics move-constructor

长话短说,我正在研究一个可以包含复制可构造对象的容器,或者那些不包含复制可构造对象的容器。类似的东西:

using AllocTraits = std::allocator_traits<Alloc>;
template <typename T>
void foo(T *to T *from, size_t n, Alloc alloc) {
  for (size_t i = 0; i < n; ++i) {
    AllocTraits::construct(alloc, to++, *from++);
  }
}

我遇到的问题是我的T可以支持复制可构造类或可移动类。所以,我采用了略微不同的方法:

using AllocTraits = std::allocator_traits<Alloc>;
template <typename T>
void foo(T *to T *from, size_t n, Alloc alloc) {
  auto mov_to = std::make_move_iterator(to);
  for (size_t i = 0; i < n; ++i) {
    AllocTraits::construct(alloc, mov_to++, *from++);
  }
}

但如果类型支持T::(T&&),我会拨打T::T(const T&)

如何撰写foo以便将T::T(const T&)作为默认值,但转移到T::T(T&&)

1 个答案:

答案 0 :(得分:0)

只需使用enable_if

template <typename T, typename Alloc, std::enable_if_t<!std::is_copy_constructible_v<T>>* = nullptr>
void foo(T *to, T *from, size_t n, Alloc alloc) {
  // for movables
}

template <typename T, typename Alloc, std::enable_if_t<std::is_copy_constructible_v<T>>* = nullptr>
void foo(T *to, T *from, size_t n, Alloc alloc) {
  // for copy-constructables
}