6

多次元配列の演算子をどういうわけかオーバーロードすることは可能ですか?

何かのようなもの:

class A {
  ...
  int& operator[][] (const int x, const int y);
  ...
}
4

8 に答える 8

12

いいえ、それは不可能です。ただし、次の 2 つの方法があります。

より小さい次元の配列を返すことができますoperator[](3D 配列の場合は 2D 配列を返し、2D 配列の場合は 1D 配列を返し、1D 配列の場合は単一の要素を返します)。次に、必要な構文で「それらをつなぎ合わせる」ことができます。( arr[x][y][z])

operator()または、複数の引数を取ることができるため、 をオーバーロードすることもできます。

次に、次のように使用して、たとえば 3D 配列にインデックスを付けることができます。arr(x,y,z)

[][]ただし、オーバーロードしたり[][][]、単一の演算子として使用したりすることはできません。

于 2012-10-18T15:45:41.943 に答える
4

直接ではありませんが、同じ機能をオーバーロードoperator[]()して、それ自体をサポートするものを返すようにすることができoperator[]()ます。

例えば:

class A {
  std::vector<std::vector<int> > vec;
public:
  std::vector<int>& operator[] (int x)
  {
      return vec[x];
  }
};

あなたが書くことを可能にするでしょう:

A a;
//...
int y = a[1][2];

適用できるをa[1]返すためです。std::vector<int>operator[](2)

于 2012-10-18T15:43:47.857 に答える
2

operator[]オーバーロードして、別の。だけを持つ新しいクラスを返すようにする必要がありoperator[]ます。

于 2012-10-18T15:43:42.707 に答える
2

いいえ、ありoperator[]ます。別の方法として、次のようにオーバーロードできます。

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

あなたはそれを使うことができます:

m(4, 5);
于 2012-10-18T15:44:18.827 に答える
0

これは、逆参照するために2回使用される単一の演算子です。演算子を逆参照し、戻り型を変更するの[]と同じように使用することで、機能と使用法を実行できます。[][]

于 2012-10-18T15:43:21.507 に答える
0

そんなオペレーターはいません。少し前に、stl 標準に近づけようとするマトリックスを実装しました。そして、この方法を使用しました。最初に、operator[] をオーバーロードして、_C_row と呼ばれる別のクラスを返しました。

_C_row operator[](size_type index) { return _C_row(/*some parameters*/); } ///< This operator is overloaded to permit the use of double pointer notation.
_C_row operator[](size_type index) const { return _C_row(/*some parameters*/); } ///< This operator is overloaded to permit the use of double pointer notation.

そして、_C_row では、operator[] 以外にもオーバーロードしました:

value_type operator*() { return _r[0]; }
pointer operator->() { return _i[_idx]; }
double_pointer operator&() { return &(_i[_idx]); }
reference operator[](size_type col) { return _r[col]; }
const_reference operator[](size_type col) const { return _r[col]; }

このソリューションは非常に柔軟であることがわかりました。私の答えがあなたに役立つことを願っています。

于 2013-12-18T10:59:30.757 に答える