32

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

カスタム リストは反復子を定義します。

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;
};

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

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

4

3 に答える 3

20

ここにあなたが興味を持っているかもしれないいくつかの記事があります

STL イテレータに基本クラスを与える

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

any_iterator クラス リファレンス

于 2008-08-13T15:47:35.707 に答える
1

何を求めているのか気をつけた場合。表示されるany_iteratorクラスは、無制限のイテレータタイプのセットで機能します。事前に知っているのは3つだけです。もちろん、将来的に4番目のタイプを追加する必要があるかもしれませんが、それでO(1)の余分なコード行が必要になるとしたらどうでしょうか。

含まれる可能性のある型の閉集合の大きな利点は、sizeof()に上限があることです。これは、ヒープとそれがもたらす間接参照を回避できることを意味します。基本的に、それらすべてをboost :: Variantに詰め込み、apply_visitorを呼び出します。

于 2008-09-24T15:44:41.220 に答える
1

遅刻しないよりはまし...

C-Vuの最新号が出てきて、その内容を推測してください。そうです、まさにあなたが望んでいたことを行う反復子です。

残念ながら、雑誌を閲覧するにはACCUのメンバーになる必要があります(この記事は、David がリンクしている 2000 年の Overload の記事を参照しています)。しかし、年間わずかな料金で、素敵な雑誌、会議、ユーザー グループを読むことができます。会員になるとバックナンバーのPDFが閲覧できるので、お待ちしております?

于 2008-08-14T11:09:02.690 に答える