长话短说,我正在研究一个可以包含复制可构造对象的容器,或者那些不包含复制可构造对象的容器。类似的东西:
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&&)
?
答案 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
}