std::不带模板的数组迭代器范围

std::array iterator range without template?

本文关键字:数组 迭代器 范围 std      更新时间:2023-10-16

使用 C 数组,编写采用任何大小数组的代码相当容易:

void func( T* itBegin, T* itEnd );
void main() {
    T arr1[1];
    func( std::begin(arr1), std::end(arr1) );
    T arr2[2];
    func( std::begin(arr2), std::end(arr2) );
}

如何使用 std::arrays 做到这一点?

void func( ??? itBegin, ??? itEnd );
void main() {
    std::array<T,1> arr1;
    func( std::begin(arr1), std::end(arr1) );
    std::array<T,2> arr2;
    func( std::begin(arr2), std::end(arr2) );
}

问题是,在MSVC 2010中,std::array<T,N>::iterator对于不同的N是不同的。这是 MSVC 2010 中的错误吗?如果不是,这种设计的理由是什么?是的,我可以从 std::array 获取指针并传递它们而不是迭代器,但这不是不必要的丑陋吗?

顺便说一句,boost::array<T,N>::iterator对所有N都是一样的.

template <class I>
void func(I begin, I end)
{
    for (auto x = begin; x != end; ++x)
        something_with(*x);
}

将它们泛型地定义为类型参数,然后像使用指针一样使用它们。 任何行为类似指针的东西都会编译,没有的东西不会编译。

类似指针的东西包括普通指针,以及标准库迭代器,以及定义operator=operator*operator++的任何其他东西。

这样做,并且您只会使用来自同一array<N>的开始/结束迭代器范围的匹配对,那么array<N>::iterator是否与array<M>::iterator不同的类型并不重要。

我所知,该标准并不要求不同大小的std::array具有相同类型的迭代器;为std::array<int, 1>std::array<int, 2>使用不同的迭代器类型似乎是合法的(尽管人们可能对实现的质量有一些意见)。

如果这是一个问题,您可以使用 C 样式数组,也可以使用指针:

func( &arr1[0], &arr1[0] + arr1.size() );

这两种解决方案都不理想,但它们是我能提供的最好的。

template <class I>
void func(I begin, I end);