次のように、C++で「スパース」ベクトルクラスを作成しようとしています。
template<typename V, V Default>
class SparseVector {
...
}
内部的には、std::map<int, V>
(V
格納されている値のタイプは)で表されます。要素がマップに存在しない場合はDefault
、テンプレート引数の値と等しいと見なします。
ただし、添え字演算子のオーバーロードに問題があります[]
。このクラスのオブジェクトを、正しく[]
機能することを期待するBoost関数に渡すため、演算子をオーバーロードする必要があります。[]
const
バージョンは非常に単純です。インデックスがマップにあるかどうかを確認し、ある場合はその値を返すか、そうでない場合はその値を返しますDefault
。
ただし、非constバージョンでは参照を返す必要があり、そこで問題が発生します。値が読み取られているだけの場合は、マップに何も追加する必要はありません(または追加したくありません)。しかし、それが書かれている場合、私はおそらくマップに新しいエントリを入れる必要があります。問題は、オーバーロードされた値が値の読み取りまたは[]
書き込みのどちらであるかを認識しないことです。単に参照を返すだけです。
この問題を解決する方法はありますか?またはおそらくそれを回避するために?