ブースト反復子ファサードで任意の反復子を実装することは可能ですか? ベースクラスで実装の詳細を定義したくない
class Base
{
public:
typedef std::vector<int>::iterator iterator;//implementation detail
...
virtual iterator begin()=0;
virtual iterator end()=0;
};
または、ゼロから完全に作成する必要がありますか。
あなたが投稿したコードは、返されたイテレータのタイプと、おそらくあなたが望むものではないBase
すべての実装を修正しました。std::vector<int>::iterator
Jeremiah の提案は、1 つの欠点を伴う 1 つの方法です。STL との互換性が失われます...私は、ポリモーフィック イテレータ ラッパーの 3 つの実装を知っています。
any_iterator
(これは を実装しますboost::iterator_facade
)opaque_iterator
ライブラリ(グーグル)、またはany_iterator
の階層が含まれています。問題は思ったよりも難しいです...私は主に、STLのようなイテレータできれいに実装するのが難しいany_iterators
型引数(any_iterator<Derived>
に自動的に変換可能でなければならない)の共分散が必要だったので、自分で試みました。any_iterator<Base>
AC#ライクEnumerator<T>
は実装が簡単です(*) (そして、一般的にSTLのようなイテレータのペアよりもクリーンなコンセプトです)が、STLを「緩める」ことになります。
(*) = もちろん「利回り」なし:-)
これはあなたが探しているものかもしれないと思います:
そのページのスニペットを次に示します::
概要
クラス テンプレート any_iterator は、反復子の boost::function に類似しています。適切な共通性がある限り、1 つの変数に異なる型の反復子を割り当てることができます。