我正在创建一个自定义的Vector / ArrayList类。但是我在创建构造函数的迭代版本时遇到了麻烦。下面的代码有效,但是问题是当我想要创建这样的ArrayList时:ArrayList arr(1, 5);
编译器不知道应该选择哪个版本的函数。
我该如何解决?
构造函数:
ArrayList(const size_type elem_amount, value_type elem) : arr_size { elem_amount }, arr_capacity{ elem_amount }
{
array = std::uninitialized_fill_n(allocator.allocate(arr_size), arr_size, elem) - arr_size;
first = array;
last = array + arr_size - 1;
}
template<typename ITER>
ArrayList(ITER begin, ITER end) : arr_size{ static_cast<size_type>(end - begin) }, arr_capacity{ arr_size }
{
std::uninitialized_copy(begin, end, array = allocator.allocate(arr_size));
first = array;
last = array + arr_size - 1;
}
最佳答案
您需要做的是使用SFINAE约束模板,使其仅在推导模板类型为迭代器类型时才起作用。由于您执行arr_size{ static_cast<size_type>(end - begin) }
来初始化size
,因此这意味着您希望迭代器是随机访问的。我们可以使用 iterator_category
的std::iterator_traits
来检查是否存在
template<typename ITER,
std::enable_if_t<std::is_base_of_v<typename std::iterator_traits<ITER>::iterator_category,
std::random_access_iterator_tag>, bool> = true>
ArrayList(ITER begin, ITER end) : arr_size{ static_cast<size_type>(end - begin) }, arr_capacity{ arr_size }
{
std::uninitialized_copy(begin, end, array = allocator.allocate(arr_size));
first = array;
last = array + arr_size - 1;
}