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 に答える