5

ブースト反復子ファサードで任意の反復子を実装することは可能ですか? ベースクラスで実装の詳細を定義したくない

class Base
{
public:
typedef std::vector<int>::iterator iterator;//implementation detail
...
virtual iterator begin()=0;
virtual iterator end()=0;
};

または、ゼロから完全に作成する必要がありますか。

4

2 に答える 2

9

あなたが投稿したコードは、返されたイテレータのタイプと、おそらくあなたが望むものではないBaseすべての実装を修正しました。std::vector<int>::iteratorJeremiah の提案は、1 つの欠点を伴う 1 つの方法です。STL との互換性が失われます...私は、ポリモーフィック イテレータ ラッパーの 3 つの実装を知っています。

  1. becker's any_iterator(これは を実装しますboost::iterator_facade)
  2. opaque_iteratorライブラリ(グーグル)、または
  3. Adobe の非常に興味深い poly ライブラリで、STL 準拠any_iteratorの階層が含まれています。

問題は思ったよりも難しいです...私は主に、STLのようなイテレータできれいに実装するのが難しいany_iterators型引数(any_iterator<Derived>に自動的に変換可能でなければならない)の共分散が必要だったので、自分で試みました。any_iterator<Base>AC#ライクEnumerator<T>は​​実装が簡単です(*) (そして、一般的にSTLのようなイテレータのペアよりもクリーンなコンセプトです)が、STLを「緩める」ことになります。

(*) = もちろん「利回り」なし:-)

于 2011-02-23T07:07:34.173 に答える
3

これはあなたが探しているものかもしれないと思います:

any_iterator: C++ イテレータの型消去

そのページのスニペットを次に示します::

概要

クラス テンプレート any_iterator は、反復子の boost::function に類似しています。適切な共通性がある限り、1 つの変数に異なる型の反復子を割り当てることができます。

于 2011-04-08T17:34:37.160 に答える