使用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获取指针并传递它们而不是迭代器,但这不是不必要的丑陋吗?
BTW,boost::array<T,N>::iterator
对于所有N
都是相同的。
答案 0 :(得分: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>::iterator
与{{array<M>::iterator
的类型不同并不重要1}}。
答案 1 :(得分:2)
据我所知,该标准不要求不同大小的std::array
具有相同类型的迭代器; std::array<int, 1>
和std::array<int, 2>
具有不同的类型似乎是合法的(尽管人们可能对实施的质量有一些看法)。
如果这是一个问题,您可以使用C样式数组,也可以使用指针:
func( &arr1[0], &arr1[0] + arr1.size() );
这两种解决方案都不是理想的,但它们是我能提供的最佳解决方案。
答案 2 :(得分:0)
template <class I>
void func(I begin, I end);