#include #include #include #include #include namespace ublas = boost::numeric::ublas; template struct row_iterator { }; template struct row_iterator > { typedef ublas::matrix matrix_t; typedef ublas::matrix_row row_t; typedef int difference_type; typedef row_iterator type; row_iterator (matrix_t & _m, int _r) : m (_m), r (_r) {} void operator++ () { ++r; } row_t operator* () { return row_t (m, r); } difference_type operator-(row_iterator const& other) { return r - other.r; } bool operator != (row_iterator const& other) { return *this - other != 0; } matrix_t & m; int r; }; template typename row_iterator >::type row_begin (ublas::matrix& m) { return typename row_iterator >::type (m, 0); } template typename row_iterator >::type row_end (ublas::matrix& m) { return typename row_iterator >::type (m, m.size1()); } template int F (range_2d_t & rng) { typename row_iterator::type ri = row_begin (rng); for (; ri != row_end (rng); ++ri) { typedef typename row_iterator::row_t row_t; row_t r = *ri; typename boost::range_const_iterator::type i = boost::begin (r); for (; i != boost::end (r); ++i) std::cout << *i << '\n'; } } int main() { ublas::matrix m (2, 2, 0); for (int r = 0; r < m.size1(); ++r) { for (int c = 0; c < m.size2(); ++c) { m (r, c) = r*m.size2()+c; } } F (m); }