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 にアクセスしていました。
悪くはないですが*1、STL-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 できるデータ構造を使いたいだけならこれで十分かなー、とも思ってる。
明日の気分次第。