Стандартный ответ должен иметь каждый []
(слева направо) возвращает прокси-сервер для правильное вложенное подмножество, последнее из которых фактически возвращает ссылку на данные. В вашей схеме было бы проще всего создать шаблонные вложенные типы для автоматизации производства.
Как таинственная user4581301 упоминает, что гораздо проще обеспечить
nsv(2,4,7,4,0,7,6)
Пример производства шаблон нужного класса, вероятно, проще, чем с использованием временного прокси-объекта:
template <size_t Width, size_t Depth, typename T=int>
struct SubSpace;
template <size_t Width, typename T>
struct SubSpace<Width,0,T> {
std::array<T, Width> array;
T& operator[] (size_t i) { return array[i]; }
T const& operator[] (size_t i) const { return array[i]; }
};
template <size_t Width, size_t Depth, typename T>
struct SubSpace {
using Nested = SubSpace<Width, Depth-1, T>;
std::array<Nested, Width> array;
Nested& operator[] (size_t i) { return array[i]; }
Nested const& operator[] (size_t i) const { return array[i]; }
};
using NSpaceVector = SubSpace<8,6>;
int main()
{
NSpaceVector nsv;
nsv[2][4][7][4][0][7][6] = 2;
cout << nsv[2][4][7][4][0][7][6] << endl; //-> 2
}
Примечание это в настоящее время не инициализирует элементы массива по умолчанию, но мы можем использовать агрегатную инициализацию в любом случае:
NSpaceVector nsv {}; // value-initialize every element
nsv[2][4][7][4][0][7][6] = 2;
cout << nsv[2][4][7][4][0][7][6] << endl; //-> 2
cout << nsv[2][4][7][4][0][7][5] << endl; //-> 0
отметить также, что SubSpace<8,6>
дает 8x7 результат вы хотели, так как глубина заканчивается на 0. Это может быть вычищено с верхним уровнем обертки, но я неохотно оканчиваются на Depth==1
вместо этого и есть все, что идет не так, когда кто-то конкретизирует SubSpace<0,0>
случайно.
Simpler еще, в зависимости от того, хотите ли вы любого поведения в классе, это:
struct OtherSpaceVector {
int s[8][8][8][8][8][8][8];
auto operator[] (size_t i) -> decltype(s[i]) { return s[i]; }
};
int main()
{
OtherSpaceVector osv{};
osv[2][4][7][4][0][7][6] = 2;
std::cout << osv[2][4][7][4][0][7][6] << '\n';
std::cout << osv[2][4][7][4][0][7][5] << '\n';
}
Труднее изменять размеры и чувствует себя более хрупким, чем версия шаблона, но все еще работает для используемого вами случая.
Вы не можете перегрузить многомерную скобку, так как в C++ такого оператора нет. Вместо этого вам нужно перегрузить одну скобку для возврата своего рода прокси-объекта, поскольку каждая перегрузка одномерной скобки будет означать второй уровень индексации, который будет возвращать другой прокси-сервер ... и так далее. – SergeyA
Дайте это прочитать для лучшего способа выполнить это с помощью 'operator()': https://isocpp.org/wiki/faq/operator-overloading#matrix-array-of-array – user4581301
Или, альтернативно, найти другое синтаксис. Как 'nsv (1,2,3,4,5,6,7)' или 'nsv [{1,2,3,4,5,6,7}]'. –