テンプレート クラスの Subscript('[]') 演算子をオーバーロードする方法を探しているときに、2 つの異なる手法に出会いました。
最初のテクニック:
コンテナーへの戻りポインターを直接オーバーロードしoperator []
ます。これにより、値の読み取りと値の割り当ての両方が可能になります。この手法の実装例:
template <class T>
class X
{
int _size;
T *container;
public:
X(int sz)
{
_size=sz;
container=new T[sz]();
}
~X()
{
}
T& operator [](int indx)
{
return container[indx];
}
};
次のようにmain()
:
X<int> sample(100);
cout<<sample[9]<<endl;
sample[9]=9;
cout<<sample[9]<<endl;
出力:
0
9
2 番目のテクニック:
2 番目の手法では、プロキシ クラスを宣言し、operator =
そのクラスを介してオーバーロードします。この手法の実装例:
template <class T>
class X
{
int _size;
T *container;
public:
X(int sz)
{
_size=sz;
container=new T[sz]();
}
~X()
{
}
class Proxy
{
int indx;
X<T> &parent;
public:
Proxy(X<T> &p, int x) : parent(p),indx(x)
{
}
void operator =(T assgn)
{
parent.container[indx]=assgn;
}
operator T const &()
{
return parent.container[indx];
}
friend class X<T>;//unnecessary line, I know!
};
Proxy operator[](int indx)
{
return Proxy(*this,indx);
}
};
同じmain()
で、同じ出力が得られます。
私は個人的に2番目の方法が好きです。しかし、私は本当にこれら2つの方法を比較したい. これら 2 つの手法の主な機能上の違いは何ですか。これらの方法にはそれぞれどのような利点がありますか?