2008-08-13 13 views
29

コンテナのセットにアクセスする一般的な方法を探しています。私は別のカスタムリストに加えて標準ベクトルとリストを持っています。汎用イテレータ

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

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

もちろん、これらはすべて異なるタイプのイテレータです。しかし、私はすべての容器が同じタイプであると仮定することができます。

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

答えて

2

で見つけるかもしれないいくつかの記事がないより遅れている... C-Vu

最新号は上がってそれに何があったかを推測します:そうです、イテレータそれは正確にあなたが望むものを行う。

残念ながら、ACCUのメンバーになる必要があります(この記事では、Davidがリンクしている2000年のOverload記事を参照しています)。しかし、丁度価格のために、読んで、会議やユーザーグループを雑誌を取得します。あなたがメンバーになったときに、あなたはバックの問題のPDFを見ることができるのでwhat are you waiting for

+2

この記事は6月8日号の第20巻第8号(C++でのカスタムイテレータ)に掲載されているとお伝えいただきまして助かりました。素敵なユーザー画像btw。 – danio

1

あなたが求めるものは慎重にする場合。表示されるany_iteratorクラスは、無制限のイテレータ・タイプのセットで機能します。あなたは3つしか持っていません。確かに、将来的には4番目の型を追加する必要があるかもしれませんが、もしそれがO(1)余分なコード行を必要とするならば?

可能な包含型のクローズドセットの大きな利点は、sizeof()に上限があることです。つまり、ヒープと間接参照を避けることができます。基本的にはboost :: variantにすべて入れてapply_visitorを呼び出します。