3

使用 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

4

3 回答 3

4
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>::iteratorarray<M>::iterator

于 2012-04-17T10:10:18.980 回答
2

据我所知,该标准并不要求不同大小std::array的迭代器具有相同类型。具有不同的类型std::array<int, 1>并且std::array<int, 2>看起来是合法的(尽管人们可能对实现的质量有一些看法)。

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

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

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

于 2012-04-17T10:15:53.210 回答
0
template <class I>
void func(I begin, I end);
于 2012-04-17T10:11:43.610 回答