1

パックされたシーケンシャル メモリ ストレージ (メモリ コピー用) を持つコンテナーを利用する関数のセットを開発しています。それらには、ほとんどの STD 関数のスタイルの関数シグネチャがあり、入力/出力反復子は要素を指し、範囲を示します。たとえば、関数は次のようになります。

template< typename InputIterator, typename OutputIterator >
OutputIterator fooBar( InputIterator& first, InputIterator& last, 
                       OutputIterator& result );

渡されたイテレータが有効であること、つまりパックされ、シーケンシャルであることを確認したいと思います。STD コンテナーの場合、これは std::vector および std::array に限定されます。残念ながら、イテレータの「カテゴリ」特性に頼ることはできません。なぜなら、ランダム アクセス特性は順次ストレージを意味しないからです。この例は、Microsoft の concurrent_vector クラスであり、ここに文書化されています。並列コンテナー

さらに、ベクトル クラスと配列クラスのすべてのイテレータを受け入れることもできません<bool

上記の制約でイテレータを区別してフィルタリングするために、独自の特性クラスを作成しようとしましたが、テンプレートの構文の問題が発生しています。この問題にどのように取り組むかについて、他の人からのフィードバックを探しています。

ありがとう

4

1 に答える 1

1

私はあなたがこれを行うことができるとは思わない. イテレータは、反復プロセスを基礎となるアーキテクチャから独立させることを全体の目的とする抽象化です。標準イテレータには、基礎となるメモリ構造を示す情報はなく、リモートで同様のものさえありません。

std-algorithm のような関数では、通常、イテレータを値渡しすることをお勧めします。これは、安価で小さなオブジェクトである必要があるためです。fooBar(c.begin(), c.end(), some_out_it);関数は非定数への参照によって入力イテレータを取得するため、as として呼び出すことはできないことに特に注意してください。

std::reverse_iterator<Iter>最後のポイントとして、少なくともContainer::(const_)reverse_iterator標準コンテナーのタイプは 1 である必要があるため、反復子の型が の特殊化であるかどうかをテストすることにより、逆反復子を除外できます。

于 2012-06-17T16:00:42.500 に答える