2009-08-03 14 views
1

私はどのように、なぜコードのこの作品は、作品を知らない:このC++コードは何をしていますか?

// postorder dfs 
Iterator< Index<String<char> >, TopDown<ParentLink<Postorder> > >::Type 
    myIterator(myIndex); 
while (goDown(myIterator)); 
for (; !atEnd(myIterator); goNext(myIterator)) 
// do something with myIterator (Traverse Through (Suffix)-tree) 

それはseqanからの例ですとインターフェイスがここで説明されていますAPI

  1. はどのようにしばらくは、FOR-に影響を与えることができますループ?
  2. forループが初期化されないのはなぜですか?
+1

ここではメタプログラミングはありません。テンプレートのすべての使用がメタプログラミングであるとは限りません。 –

+1

私はテンプレートのメタプログラミングの最悪の事は、今では多くの人がテンプレートを持つコードがメタプログラミングの一例だと思っているようです。 –

+2

タイプIterator >、TopDown > :: Typeは、回答を選択しないためにメタプログラム –

答えて

18

あなたは、構文的には有効ですが人間の解析が難しい言語の構文を使用して、C++の面白い部分を実行しました。

while (goDown(myIterator)); 

これはfalseを返すまで「goDown(myIterator)」になります。その後、forループに進みます。それは何もループしていませんが、それは問題ありません。なぜなら、関数goDownは仕事をしているからです。

for (; !atEnd(myIterator); goNext(myIterator)) 

これは何を初期化するが、それは(myIterator)をatEndていないテストされません - それはありませんが、それはgoNext(myIterator)になります。また、それはslghtly容易に理解できるようにすること、whileループのように書くことができます

while(!atEnd(myIterator)) 
{ 
    goNext(myIterator)); 
} 

だからコードは以下となります。

  1. 倉庫()がfalseを返すまでダウン行くを - これは倉庫がmyIteratorを変更していることそれは
4

明らかに、goDowngoNextを基準と変化させることによって、それらの引数を取っているatEnd()になるまで、各時間

  • goNext()それ。あなたの2つの質問への答えは、whileはを何度も呼び出し、myIteratorを変更して呼び出します。これは、forwhileそれを残して - それはもちろん、それを再割り当てしない、それはすべての中の仕事を元に戻すだろう!

  • 関連する問題