web-dev-qa-db-ja.com

C ++:クラス内からoperator []にアクセスする便利な方法?

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

operator[](bar)またはthis->operator[](bar)を記述できることは知っていますが、これらはかなり扱いにくく、そもそも演算子の利便性を大幅に低下させます。 (演算子を呼び出す新しいメソッドを追加できることも知っています。)_this[bar]_または_this->[bar]_または同様の素晴らしいものを書く方法はありますか?

:この質問は多くの単項演算子にも当てはまる可能性があります(たとえば、クラス内から_foo++_を呼び出すにはどうすればよいですか?)が、個人的には_operator[]_のみを気にします。

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

39
A. Rex
(*this)[bar];

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

58
Evan Teran

使用する

(*this)[bar]

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

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

4
Mr Fooz

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

3

私は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 .. ..

3
Robert Gould

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

1
Drew Hall
 operator[](bar) 

これも機能するはずです。わたしにはできる!

1
user3199814