私は行列を使用する必要があると私はintデータ型のため、たとえば、宣言のこの種を使用しています:C++ - カスタムマトリックス構造体
std::vector < vector <int>> my2Dvec(rows, vector <int> (cols));
しかし、今、私は、複数のデータ・タイプのためにそれを使用したいと思いますので、私は、このテンプレートを宣言:
template <typename T>
struct matrix
{
int col, row;
std::vector <std::vector <T>> data;
matrix(int c, int r) : col(c), row(r), data(col, std::vector <T> (row))
{
;
}
};
だから私はようとしてそれを使用することができますどのように私は(可能な場合)を使用することができ、今
matrix <int> m(10, 10);
...
m.data[1][2] = 0;
:
m[i][j] = someValue;
?どのようにそのような機能を実装するには?あなたはそれはあなたが結果を得るために再びoperator[]
を使用することができた上でプロキシオブジェクトを返しますような方法でoperator[]
を実装する必要が
int& operator[](std::size_t i) { return data[i]; }
あなたはこれに新しいですので、あなたが使用してそれを単純化したい場合があります()演算子は代わりに[]の演算子は2を持つ:ここで
はダックタイピングによるカプセル化を尊重する例ですパラメーター。つまり、単純にT&operator()(const uint x、const uint y){return data [x] [y];}、T operator()(const uint x、const uint y)const {return data [ x] [y];}、これはm(i、j)= someValue;のようなアクセスをもたらす。プロキシメソッドより読みやすいかもしれません。いずれにしても、サブベクトルを保護したい - m [i] .resize(3)は動作しません。そのため、すべての属性が構造ではなく非公開であるクラスとして、それを行うことができます。 – Aziuth