strite.cc

strcpy(dst, src);

じゃなくて

copy(src, src+strlen(src)+1, dst);

を使うのはなんかおかしいと思う。まず +1 を忘れるとか。いやそれは私が忘れてただけなんですが。そんなことはどうでも良くて、 strlen を呼んでるのがおかしい。なんで文字列をコピーするのに二度全体をなめるの、と。 C++ の、 C より遅くなってはいけない、っていう貧乏症至上命題が浸透してれば、 copy&strlen は気持ち悪い、と思う。

というわけでちょっとマシ?な物体 strite を考えました。

#include <cassert>
#include <cstring>
#include <algorithm>
using namespace std;

class strite : public iterator_traits<const char*> {
    const char* p;
public:
    typedef forward_iterator_tag iterator_category;
    strite() : p(0) {}
    strite(const char* s) : p(s) {}
    void operator++() {
        if (!*p) p = 0;
        else p++;
    }
    char operator*() { return *p; }
    bool operator==(strite& r) { return p==r.p; }
    bool operator!=(strite& r) { return p!=r.p; }
};

int main() {
    const char* src = "hoge";
    char dst[256];
//    strcpy(dst, src);
//    copy(src, src+strlen(src)+1, dst);
    copy(strite(src), strite(), dst);
    assert(!strcmp(src, dst));
    return 0;
}

実装は適当です。めんどくさいから forward_iterator になってるとか。 end の状態から -- できないのがアレですがまぁいいとしようかと思います。他の解もいくつか考えましたが効率が一番落ちなさそうなのを選びました。これでも比較が1回多くなっちゃうのでやはり strcpy が正解だと思いました。

(EOO

題はかっこいいOOと読ませるつもりらしいですよ。

http://d.hatena.ne.jp/ABA/20060614#p1

じゃあOO的にかっこいいってのは、何が評価軸なんだろ?

なんなんでしょ、と思いました。

やはり可読性とかもあると思うので、いくつか軸があって、可読性が高いか否か、汎用性が高いか否か、タイプ量が少ないか多いか、とかの複合要因なんですかね。

そういうのを評価するコンパイラがあったら良いと思った。かっこよさのパラメータが50を切るとwarningが出て20を切るとエラー。

というわけでOO度チェックを作ってみました。あなたのコードをはりつけて下さい。

http://shinh.skr.jp/tmp/oo.cgi

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h