質問

一連のコンテナにアクセスする一般的な方法を見つけようとしています。別のカスタム リストに加えて、標準のベクトルとリストがあります。

カスタム リストはイテレータを定義します。

class Iterator: public std::iterator<std::forward_iterator_tag, T> {
    // ...
}

Iterator begin() {
    return (Iterator(root));
}

Iterator end() {
    return (Iterator(NULL));
}

適切な演算子がオーバーロードされています。

理想的には、これを実現したいと思っています。

class Foo {
public:
    Foo() {
        std::list<int> x;
        std::vector<int> y;
        custom_list<int> z;

        iter = x.begin(); // OR
        iter = y.begin(); // OR
        iter = z.begin();

        // ...
    };
private:
    std::iterator<int> iter;
};

しかし明らかに、これらはすべて異なる型の反復子です。ただし、すべてのコンテナが同じタイプであると想定できます。

この問題を解決するエレガントな方法はありますか?

役に立ちましたか?

他のヒント

遅刻しないよりはマシです...

最新号は、 C-Vu 現れて、何が入っているか推測してください。そうです、それを行うイテレータです その通り あなたが望んでいたもの。

残念ながら、会員になる必要があります。 ACCU 雑誌を表示します (この記事は、David がリンクしている 2000 年のオーバーロード記事を参照しています)。しかし、年間わずかな料金で、読み応えのある雑誌、カンファレンス、ユーザー グループを手に入れることができます。会員になるとバックナンバーのPDFもご覧いただけますので、 何を待っていますか?

何を求めるかに注意するケース。表示されている any_iterator クラスは、無制限のイテレータ型セットで動作します。事前にわかっているのは 3 つだけです。確かに、将来的に 4 番目の型を追加する必要があるかもしれませんが、そのために O(1) 行の余分なコードが必要になったらどうなるでしょうか?

含まれる型の閉じたセットの大きな利点は、sizeof() に上限があることです。これは、ヒープとそれがもたらす間接化を回避できることを意味します。基本的に、それらをすべて boost::variant に詰め込んで apply_visitor を呼び出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top