<< 前 ホーム 次 >>

bakaid: 20061205

iteratorとreverse_iteratorとを別物にしなきゃいけない
理由がわからない。

多分、C++的な発想としては、次のような関数が好まれる:

void
doit(vector<int>::iterator beg, vector<int>::iterator end)
{
    while (beg != end) {
        ...
        ++beg;
    }
}

他の言語なら:

void
doit(vector<int> vec)
{
    for (vector<int>::iterator it = vec.begin();
         it != vec.end(); ++it) {
        ...
    }
}

と書くのがフツー。

で、最初にあげたような書き方が好まれるとした場合、
iteratorとreverse_iteratorとを区別していることが
不便になる。なぜなら、もしiteratorとreverse_iteratorとを
区別していなければ、vectorを逆順にたどらせたいとき
には:

doit(vec.rbegin(), vec.rend());

と書けば済む。しかし、現実にはiteratorとreverse_iterator
とは区別されているから:

void
rdoit(vector<int>::reverse_iterator beg, vector<int>::reverse_iterator end)
{
    while (beg != end) {
        ...
        ++beg;
    }
}

といった別の関数を用意しなくちゃいけない。
やっていること、つまりdoitの本体とrdoitの本体の
字面はまったく同じなのに。

何か自分が間違えてる?

--

上のコードを実際に適用してみたんだけど:

void
CDrawAppView::drawRects(CDC* dc, std::vector<GeomRect*>::reverse_iterator rbeg,
                        std::vector<GeomRect*>::reverse_iterator rend)
{
    while (rbeg != rend) {
        (*rbeg)->draw(dc);
        ++rbeg;
    }
}

どう見てもキチガイが書くコードにしか見えないよな。
たかが配列を逆順にアクセスするだけなのに、なんで
こんなに狂ったようにタイプしなきゃいけないの?
IDEが助けてくれるとか、そういう問題じゃないよな。
情報量が多いっていうだけで、それは害悪なんだから。
typedefで回避するっちゅーのが常套手段なんだろう
けど、でも、それもなんか小手先っぽいしな。

でもって、C++で何が絶望的かというと、こうした問題が
解決されるのは少なくとも今世紀中にはなさそうだという
こと。このあたりは言語の改善速度が速いJavaとは対照的。

ひょっとしたら、今C++が盛り上がってるように見えて
いても、やっぱり一時的なものなのかも。いや、どんな
言語でもピークっていうのは一時的なものなんだけど。
でも、自分はちょっとC++を買いかぶっていたかも。

結局のところ、Cのオブジェクト指向拡張言語として
使われるC++ではダメなわけで、それはJavaに覇権を
奪われたことで証明済み。少なくとも今C++が盛り上がって
いるように見えるのは、マルチパラダイム言語の面で
あって、でも、それはニッチだし、そこを使いやすく
しようとすれば言語を大幅に変えないといけないし、
それは標準化という十字架を背負っているC++にはほぼ
不可能。

これは繰り返しになるけど、C++最大のパトロンだった
MSがC++から徐々に手を引こうとしていることからしても、
今後のC++については悲観せざるを得ない。

--

C++はまだまだ全然知りませんから、間違ったことを
書いてるかもしれません。何かあればご指摘ください。

本家Permlink

<< 前 ホーム 次 >>


Copyright © 1905 tko at jitu.org

バカが征く on Rails