2

operator() には 2 つのバージョンがあります。

const A& operator(int x ,int y) const;
A& operator(int x ,int y);

しかし、コードの繰り返しを避けるための最善の方法が何であるかはわかりません (基本的に同じロジックを持っているため)。

演算子のオーバーロード (およびその他の質問) に関する素晴らしい FAQ を読みましたが、答えが見つかりませんでした。

EDIT_1: Skizzが提案した提案を試しましたが、そのようなものはうまく機能しませんが、何かを見逃している可能性があります:

これは、次のエラーを与えてコンパイルない間に機能するためです。

エラー: タイプ 'const value_type {aka const int}' の式からのタイプ 'int&' の参照の無効な初期化</p>

4

3 に答える 3

1

問題のデータを共有/一意のポインターとして持っている場合は、それを共通の関数に転送できます。

class X {
    public: 
    const A& operator () (int x ,int y) const { 
        common(data, x, y);
        return *data;
    }

    A& operator () (int x ,int y) { 
        common(data, x, y);
        return *data;
    }

    private:
    void common(std::shared_ptr<T>, int x ,int y) const;
    std::shared_ptr<A> data;
};

これで、'T* get() const' である data.get() 経由で T* にアクセスできるようになりました。(注:共通機能は悪い設計だと思います)

また、次のこともできます。

class X {
    public:
    const A& operator () (int x ,int y) const { 
        common(x, y); 
        return data;
    }

    A& operator () (int x ,int y) { 
       // ... make mutations
       common(x, y); 
       // ... make mutations
       return data;
    }

    void common(std::shared_ptr<T>, int x ,int y) const;
    T data;
};

または、実際には、論理定数を壊していない場合は、データを変更可能にします。

class X {     
    const A& operator () (int x ,int y) const { 
        // ... make mutations on the mutable data, only
        return *lazy_evaluated_data;
    }

    A& operator () (int x ,int y) { 
        const X& self = *this;
        self(x, y);
        return *lazy_evaluated_data;;
    }

    private:
    mutable T lazy_evaluated_data; // or a cache
};
于 2013-09-09T15:30:29.917 に答える
0

ヘルパー関数を作成し、両方の演算子から呼び出します。醜いことをする必要がありますがconst_cast<...>(this)、それは一般的なパターンです。

于 2013-09-09T15:16:04.780 に答える