質問

配列の添字/括弧演算子である operator [] をオーバーロードするC ++クラスがあります。これは、 foo [bar ]と書くことができるクラスの外では非常に便利です。ただし、クラス内でメソッドを実装しているときに、この表記法の使用方法を理解することはできません。

operator [](bar)または this-> operator [](bar)を書くことができることは知っていますが、これらはかなり扱いにくく、多くのものを奪いますそもそもオペレーターの利便性。 (演算子を呼び出す新しいメソッドを追加できることもわかっています。) this [bar] または this-> [bar] を記述できる方法はありますかまたは同様に素敵なものですか?

:この質問は、多くの単項演算子にも適用される場合があります(たとえば、クラス内から foo ++ を呼び出す方法はありますか?) operator []

編集:投稿してすぐに(* this)[bar] を使用できることに気付きました。これまでのすべての答えもこれを示唆しています。他の選択肢はありますか?

役に立ちましたか?

解決

(*this)[bar];

私には問題ありません。

他のヒント

(* this)[bar] の代わりに、 operator [] の機能を果たす名前付きメンバー関数を使用します。オーバーロードされた演算子は、ユーザーの作業を容易にします。さらに重要なことは、それらはクラスのインターフェースの一部です。独自のパブリックインターフェイスの観点からクラスを実装することが本当に意味があるかどうかを自問してください。そうでない場合は、別の(保護またはプライベート)メンバー関数を作成して作業を行い、 operator [] および他の関数がそれを呼び出すようにすることをお勧めします。

at()関数を使用し、operator []で舞台裏でat()関数を呼び出すため、operator []は単なる構文上の砂糖です。それがstd :: vectorが行う方法であるため、合理的な(優先順位のある)方法のようです。

完全なシンタックスシュガーハックになりました(完全に推奨することはできませんが、あなたの空想にぶつかるかもしれません):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

また、参照のコストを支払うことなくこれを無料で行いたい場合、 AND はプログラマーに苦しみを与えることに専念する悪魔の信奉者です:

#define self (*this)

実際、これがほとんどのハンドルがAppleのNS APIで実装されている方法だと思います...

使用

(*this)[bar]

インスタンスオブジェクトの operator [] を呼び出します。

this [bar] は、 this ポインターを配列として扱い、その配列の bar 番目の要素にインデックスを付けます(無効なオブジェクト参照)。

(* this)[bar] を使用できますが、それほど改善されない可能性があります...

 operator[](bar) 

これも動作するはずです。それは私のために働いています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top