48

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

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

4

6 に答える 6

70
(*this)[bar];

私にとってはうまくいきます。

于 2009-03-03T03:47:52.443 に答える
7

使用する

(*this)[bar]

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

barが整数である (または整数に自動変換できる)と仮定すると、ポインターは配列としてthis[bar]扱われ、その配列の - 番目の要素にインデックスが付けられます。が配列にない限り、未定義の動作が発生します。が整数に似ていない場合は、コンパイル時エラーが発生することが予想されます。thisbarthisbar

于 2009-03-03T03:48:42.957 に答える
4

私は 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;
}

また、参照のコストを支払うことなくこれを無料で行いたい場合、およびプログラマーを苦しめることに専念している邪悪な宗派の信者である場合は、次のことができます。

#define self (*this)

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

于 2009-03-03T04:14:51.490 に答える
3

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

于 2009-03-03T04:09:50.160 に答える
1

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

于 2009-03-03T03:48:47.200 に答える