ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

constと非constのメンバ関数の重複を取り除く

Effective C++ 第1章3項
あるクラスのメンバ関数でconstと非constの両方を用意した場合、それぞれに同じ処理のコードを書くという面倒なことになってしまう。それを避けるためには非constの関数ではconstな関数をconstを取り除いて呼ぶようにすればよい。実際に[]演算子で実装した例が次の通り。

class Test {
private:
    char* m_pText;
public:
    const char& operator[](std::size_t pos) const
    {
        // 何らかの処理 たとえば範囲チェックなど。
        // ...
        return m_pText[pos];
    }

    char& operator[](std::size_t pos)
    {
        return
            const_cast<char&>(
            static_cast<const Test&>(*this)[pos] );
    }
};

非constの関数ではまず*thisをstatic_castでconstを付けて[]を呼び出し、const_castでconstを取り除いている。
逆にconstの関数から非constの関数を呼ぶというのは良くない。constの関数は値を変更しないというのを保証しているものだから、内部で非constな関数を読んでしまってはそれが保証できなくなってしまう。