STL-like な iterator で repeated なデータを列挙

昨日書いたコードは

int size = bar.baz_size();
for (int i = 0; i < size; i++) {
  cout << "bar.baz[" << i << "].type: " << bar.baz(i).type() << endl;
}
$ ./read
bar.baz[0].type: 0
bar.baz[1].type: 1
bar.baz[2].type: 2

このようにして、repeated Bar baz にアクセスしていました。
悪くはないですが*1STL-like な iterator を使っても同様なことができるみたいです。

typedef google::protobuf::RepeatedPtrField<foo::Bar::Baz>::const_iterator Baz_iterator;  //長いから typedef しただけ
Baz_iterator it, end;
it = bar.baz().begin();
end = bar.baz().end();
while (it != end) {
  cout << (*it).type() << endl;
  it++;
}
$ ./read
0
1
2

しばらく C++ でコーディングすることがなかったから、iterator の使い方があっているか少し不安だったり。
まぁ、ちゃんと思った通りに出力されているからいいか。


ちなみに、昨日は

package foo;
message Bar {
  message Baz {
  }
}

とすると、Baz のクラス名は foo::Bar_Baz になると書いたけど、foo::Bar::Baz でもいいみたい。
というのは、foo::Bar のクラス定義の中で typedef Bar_Baz Baz としてくれているからだ。
同様に、

package foo;
message Bar {
  message Baz {
    enum Type {}
  }
}

は、foo::Bar_Baz_Type でも foo::Bar::Baz::Type でもいい。


他にも Extentions や Services なんて機能があるみたいだけど、目を通しただけじゃ何に使えるのかよくわからなかった。
もしかしたら明日読むかもしれないけど、容易に Serialize できるデータ構造を使いたいだけならこれで十分かなー、とも思ってる。
明日の気分次第。

*1:というか、個人的にはむしろ iterator を使うより、こっちのほうが好き