(STL) iteratorってキャストできるのね(^^;)

こんなインターフェースははたして可能か??
(すみません、かなりオタクっぽいです。行末が切れてたらフォントのサイズをおとして下さい)

using namespace std;

class IParticlePtrVect {
public:
virtual ‾IParticlePtrVect() {}
typedef vector<I3IParticle*>::iterator iterator;
virtual iterator begin() = 0;
virtual iterator end() = 0;
};

ちなみに、I3IParticleはデータメンバなし、関数全部pure virtualの粒子クラス(Javaのinterfaceみたいなやつ)とします。

一方、実装は、

class MyParticlePtrVect : public IParticlePtrVect {
public:
virtual ‾MyParticlePtrVect() {}
virtual iterator begin() { return (iterator &)vector_.begin();}
virtual iterator end() { return (iterator &)vector_.end(); }
private:
vector<MyParticle> vector_;
}

という感じで、MyParticleはI3IParticleを継承した粒子クラス、ということにします。実際に実験した例はboostのshared_ptrを使っていて、データメンバのvector_はvector<shared_ptr<MyParticle> >型です。勿論、vector_にデータをつめるためのpush_back()みたいなのも実装しないとだめだけど割愛します。

で、問題は、このうちのbegin(), end()関数の中身

(iterator &)vector_.begin();

の(iterator &)型キャストは許されるのか、という話です……。

こんな面倒なことせんでも、普通にvector<I3IParticle*>を使えばええやん、という声が聞こえてきそうですが、serializationの事情により、実体に何がつまるかわからんvector<I3IParticle*>型のデータメンバは持ちたくない、というわけです。
(そのへんも自動で判断して正しく保存してくれる賢いpointerがshared_ptrじゃないのか、とめっちゃイチャモンつけたくなりますが、ユーザー定義粒子を含むライブラリをいちいちロードしないと動かんというのはUserが混乱する、という開発グループの方針に沿って苦肉の策というわけです。自分が使うモジュールのロードくらい自分で責任持つわい、と思う私はもう旧世代か??)

で、実験結果ですが。
なんと、コレ、動いちゃったりするんですね。。
まあ、stlのvectorのiteratorは実質ポインタだけど、stl_vector.hをのぞいてみたらただ生ポインタというわけでもなくて、こんな事できそうにもないと早々に諦めていたんですよ。
でも他にどうしても手だてがなくて、ダメモトでやってみたらコンパイルも通ってまともに動いてしまった! なんで動くのか未だにナゾ(笑)。

だれか、理由を知ってる人がいたら教えて下さい。。
(…って、コメント不可にしてるの忘れてた…)コメントOKにしました♪
[PR]
by lily_lila | 2006-05-13 05:19 | Programing Tips | Comments(0)

渡米生活日々の備忘録。


by lily_lila
カレンダー
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30