с макушки головы:
template <class element_type>
class matrix
{
public:
matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) { }
element_type &operator()(size_t row, size_t column)
{
// column major
return m_storage[std::slice(column, m_height, m_stride)][row];
// row major
return m_storage[std::slice(row, m_stride, m_height)][column];
}
private:
std::valarray<element_type> m_storage;
size_t m_stride;
size_t m_height;
};
std::valarray
предоставляет много интересных способов доступа к элементам через срезы, маски, многомерные срезы или таблицу косвенности. См. std::slice_array
, std::gslice_array
, std::mask_array
и std::indirect_array
для получения более подробной информации.