我正在创建一个自定义的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;
}

10-07 13:34
查看更多