読者です 読者をやめる 読者になる 読者になる

バイストンウェルへの扉が開いた

嘘です。オーラロードとかなんのこっちゃです。
オーバーロードの続き+mnagakuさんへの反応。

逆に、複雑さを隠蔽する力もあると思う。C++演算子オーバーロードを知って最初に思ったのは「行列の四則演算とか素直に書ける」だった。「A.add(B)」でなく「A*B」と書ける。数式が素直に書けることで、コード表現より一般的な数式表現で記述できることになる。もっと言えば、演算子の記号を自由にできたら、外積とか内積とか2項演算子を書きたい放題できる。数学という規約を暗黙知として導入できれば、記述上の複雑さを減らせるわけだ。

404 Not Found

演算子のオーバーロードは確かに「複雑さを隠蔽する」力を持つのですよね。
しかし、

c = a * b;

としたときに、aとbが実際は巨大なMatrixか何か(とても複雑なもの)でえらいこっちゃ、
な(膨大な処理コストを持つ)計算をしている可能性もあれば、
(隠蔽してほしくないものを隠蔽してしまう)

    // メンバ関数
    bool operator|| (bool flag){
        // 本当に無意味な例
        return true;
    }

と定義してあるとき、

    if (true || ::isEnableDevice()) {
        // 短絡的評価によりisEnableDeviceは評価されない
    }
    // 上とは別物 a はメンバにoperator||を持つため
    if (a || ::isEnableDevice()) {
        // 下記と同義
    }
    if (a.operator||(::isEnableDevice())) {
        // operator呼び出しにより引数であるisEnableDeviceは評価される
    }

みたいな不明なコードを生成してしまう「可能性を持つ」訳で、
諸刃の剣とも言えますね。


記述上簡素になるのはありがたくもあり、
使いこなせない人たちが使えてしまうのはありがた迷惑である可能性もあり、
それらを天秤にかけた結果、
演算子オーバーロードなんかさせんよ、でもStringだけは+で連結することを赦します!」
というのは、Vmaxで疾走しようとする人を食い止めるJavaの優しさなのかなぁ、
なんて思いました。まる。
JavaにはJavaの、C++にはC++の優しさがあるというか。

Vector2DとかVector3Dとか作ったときに、
v1.add( v2 );
ではなく、
v1 += v2;
とかできるのはやっぱり便利なんですけどね。


追記:id:uskzさんの言うとおり、巨大な計算、複雑な計算に関しては確かに

ぼくたちにはETという希望の光ががが.

梶本裕介の日記

Expression Templateという手があります。
(その場で計算せず式を覚えて必要な時に必要なだけ遅延評価)