2011-08-08 8 views
3

私はそれが可能かどうか、ループのカスタムを考えました。私が念頭に置いていた一つは、私がforeachループで動作するように望んでいた私は、私が書いたカスタムコンテナのためにそれを書きたかったカスタムforループをC++で書いて

for(Container c : Element e){ 
     // do stuff with e 
} 

です(cust_contそれを呼び出すことができます)Javaからforeachの式、(でしたブーストからのもののように)。しかし、イテレーターなどを読み込む前に、明示的に必要な場合は、私が望むループを実装することができますか?

+3

すでに機能であるC++ 0xを使用している場合は、そうでなければ、forキーワードを使用しないで少なくとも別の構文が必要なので、私は推測しません。 – RedX

+0

@RedX:質問は、カスタムコンテナのイテレータを実装せずに構文を使用することだと思います。 –

答えて

4

ない私はあなたの質問を理解し、しかし、はい、あなたはへの反復のために(理想的にconstに過負荷状態)begin()end()メソッドを実装するために持っていることを確認しますカスタムコンテナで作業します。また、ネストされたiteratorconst_iteratorタイプ(またはtypedef)が必要です。ここでは、要約すると何が必要です:

メンバータイプ:

MyClass::iterator 
MyClass::const_iterator 

メンバ関数:

MyClass::iterator MyClass::begin(); 
MyClass::const_iterator MyClass::begin() const; 
MyClass::iterator MyClass::end(); 
MyClass::const_iterator MyClass::end() const; 
+0

ありがとう、私はそれをします。 – ArniBoy

3

このようなループは、という範囲ベースのループと呼ばれ、C++ 0xで追加された機能です。

だから、C++ 0xの中に、あなたはこれを書くことができます:

cはタイプ Elementのオブジェクトのコンテナであり、メンバ関数として beginendを定義している、ORに渡すことができ
for(Element e : c) { 
     // do stuff with e 
} 

begin()およびend()引数依存ルックアップ(ADL)で検索される関数であり、stdは関連する名前空間の1つです。

+0

私はそれが働いていることを知らなかった。私は0x文書をもっと徹底的に読むべきだと思う。ありがとう – ArniBoy

+0

@ Nawaz:それは 'std :: begin'と' std :: end'ですか、それとも典型的なADLを通して見いだせるフリー関数 'begin'と' end'ですか? 'swap'は例えばADLを使います。 –

+0

@Matthieu:そうです。彼らはADLで検索します。答えを編集しました。ありがとう:-) – Nawaz

0

あなたは、このような何かマクロを書くことができます。

foreach(Element, e, c) { ... } 
0

は、カスタムコンテナのためにこれを行う方法ではなく、C++ 11以降fredoverflow's answerを参照してください。

for(auto element : container) 
    //do something with element