Если вам действительно нужна эта функциональность, возможно, вы могли бы рассмотреть возможность создания подкласса матрицы и переопределения оператора (), чтобы поиграть с индексами для вас. Например:
using namespace boost::numeric::ublas;
template<typename T>
class Reindexable : public matrix<T>
{
public:
Reindexable() : m_offset(0) {}
void reindex(int offset) { m_offset = offset; }
T& operator()(int i) { return matrix<T>::operator()(i + m_offset); }
/* Probably more implementation needed here ... */
private:
int m_offset;
}
В последнее время я программирую на VB.NET (да!) И на C #, так что я немного устала от синтаксиса C ++ и, возможно, допустила несколько ошибок в приведенном выше, но общая идея должна работать. Вы делите матрицу на подклассы, чтобы обеспечить операцию переиндексации и переопределить оператор скобок, чтобы он знал о новом смещении индекса. Конечно, в реальной реализации вам потребуются смещения для каждого измерения матрицы.
Кроме того, если у вас когда-либо есть ссылка или указатель на ваш Reindexable
, а тип ссылки / указателя равен matrix<T>
, то вы будете использовать старый оператор индекса, поэтому будьте осторожны!