多次元配列の演算子をどういうわけかオーバーロードすることは可能ですか?
何かのようなもの:
class A {
...
int& operator[][] (const int x, const int y);
...
}
多次元配列の演算子をどういうわけかオーバーロードすることは可能ですか?
何かのようなもの:
class A {
...
int& operator[][] (const int x, const int y);
...
}
いいえ、それは不可能です。ただし、次の 2 つの方法があります。
より小さい次元の配列を返すことができますoperator[]
(3D 配列の場合は 2D 配列を返し、2D 配列の場合は 1D 配列を返し、1D 配列の場合は単一の要素を返します)。次に、必要な構文で「それらをつなぎ合わせる」ことができます。( arr[x][y][z]
)
operator()
または、複数の引数を取ることができるため、 をオーバーロードすることもできます。
次に、次のように使用して、たとえば 3D 配列にインデックスを付けることができます。arr(x,y,z)
[][]
ただし、オーバーロードしたり[][][]
、単一の演算子として使用したりすることはできません。
直接ではありませんが、同じ機能をオーバーロード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)
operator[]
オーバーロードして、別の。だけを持つ新しいクラスを返すようにする必要がありoperator[]
ます。
いいえ、ありoperator[]
ます。別の方法として、次のようにオーバーロードできます。
int &operator()(int x, int y);
あなたはそれを使うことができます:
m(4, 5);
これは、逆参照するために2回使用される単一の演算子です。演算子を逆参照し、戻り型を変更するの[]
と同じように使用することで、機能と使用法を実行できます。[][]
そんなオペレーターはいません。少し前に、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]; }
このソリューションは非常に柔軟であることがわかりました。私の答えがあなたに役立つことを願っています。