gpt4 book ai didi

c++ - 如何让构造函数接受所有类型的迭代器?

转载 作者:行者123 更新时间:2023-11-30 01:01:34 25 4
gpt4 key购买 nike

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

关于c++ - 如何让构造函数接受所有类型的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58867411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com