Quando chiamo: a7 [0] [1] [100];Operatore [] Sovraccarico in array multidimensionali C++
Sono in grado di ottenere il primo indice '0' nell'operatore [] ma come indice non sarà in grado di ottenere altri valori di indice 1 e 100 in modo ricorsivo. Come potrei usare l'operatore [] per ottenere valori di indice folowing ricorsivi. In questo esempio per la matrice tridimensionale, l'operatore [] viene chiamato solo una volta per la prima dimensione che è '0'.
My Code Esempio:
template <class T, unsigned ... RestD> struct array;
template <class T, unsigned PrimaryD>
struct array <T, PrimaryD> {
typedef T type[PrimaryD];
type data;
T& operator[] (unsigned i) {
return data[i];
}
};
template <class T, unsigned PrimaryD, unsigned ... RestD>
struct array <T, PrimaryD, RestD...> {
typedef typename array<T, RestD...>::type OneDimensionDownArrayT;
typedef OneDimensionDownArrayT type[PrimaryD];
type data;
OneDimensionDownArrayT& operator[] (int i) {
OneDimensionDownArrayT& a = data[i];
return a;
}
};
int main() {
array<int, 1, 2, 3> a7 {{{{1, 2, 3},{4, 5, 6}}}};
a7[0][1][2] = 100; //=>won't recursively go through operator[]
//I want to recursively obtain 0, 1 and 2 as index values
a7[0][1][100] = 100; //also works correctly.
std::cout << a7[0][1][100] << std::endl;
return 0;
}
Quindi qual è il problema? Che comportamento stai vedendo? Se dà un errore di compilazione, che cos'è? Qual è il comportamento di runtime? Qual è il tuo compilatore e versione? Un po 'più di informazioni non fa male, lo sai! – yzt
Hai considerato ... non farlo? Usa invece un overload 'operator()'. In realtà, le persone cercano * way * troppo difficile da calzare 'operatore []' in matrici multidimensionali. –
Un paio di note a margine: [Perché l'interfaccia della mia classe Matrix non dovrebbe apparire come un array di array?] (Http://www.parashift.com/c++-faq/matrix-array-of-array.html) e [Ancora non capisco. Perché l'interfaccia della mia classe Matrix non dovrebbe apparire come un array di array?] (Http://www.parashift.com/c++-faq/matrix-c-style-subscript.html) –