Тема: Як створити опереатор доступу схожий на A(1,:,1) як в Matlab
Пишу клас багатовимірного масиву, вимірність задається шаблонним параметром. Потрібно реалізувати оператор який повертає ітератор на відповідний вимір, тобто для матриці
1 2
3 4
в Matlab A(:,1) повертає 1 3, а A(1,:) повертає 1 2. Мені треба якось красиво передати цю двокрапку. Я не можу вигадати нічого краще ніж
template <size_t Dim> class Mat {
template <size_t VDim>
VectorIterator getVector(const array<size_t, VDim>&, const array<size_t, Dim - VDim - 1>&);
};
...
Mat<4> mat(...);
mat.getVector<2>({1,2}, {3}); // те саме, що і A(1,2,:,3)
Чи є щось краще?
---
Насправді getVector виглядає якось так, бо std::array<T, 0> не визначений:
template <size_t VDim, typename enable_if<VDim == 0>::type* = nullptr> const_iterator getVector(const array<size_t, Dim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<0 < VDim && VDim < Dim - 1>::type* = nullptr> const_iterator getVector(const array<size_t, VDim>& indexBefore, array<size_t, Dim - VDim - 1>& indexAfter) const;
template <size_t VDim, typename enable_if<VDim == Dim-1>::type* = nullptr> const_iterator getVector(const array<size_t, Dim - 1>& indexBefore) const;
Наводжу це окремо, щоб не відтіняти основну логіку.