:
template<typename T , std::size_t ROWS , std::size_t COLUMNS>
class column_iterator
{
std::size_t _row;
const std::size_t _column;
T& _array[ROWS][COLUMNS];
public:
column_iterator( T (&array[ROWS][COLUMNS]) , std::size_t column , std::size_t pos = 0) :
_array{ array } ,
_row{ pos } ,
_column{ column }
{}
const T& operator*() const
{
return _array[_row][_column];
}
T& operator*()
{
return _array[_row][_column];
}
column_iterator& operator++()
{
_row++;
return *this;
}
friend bool operator==( const column_iterator& lhs , const column_iterator& rhs )
{
return lhs._row == rhs._row && lhs._column == rhs._column;
}
};
factory, :
template<typename T , std::size_t ROWS , std::size_t COLUMNS>
column_iterator<T,ROWS,COLUMNS> iterate_column( T (&array[ROWS][COLUMNS]) , std::size_t column , std::size_t row = 0 )
{
return column_iterator<T,ROWS,COLUMNS>{ array , row , column };
}
:
int main()
{
int foo[2][2] = { {1,2} ,
{3,4} };
auto iterator = iterate_column( foo , 0 );
}
:
template<typename T , std::size_t ROWS , std::size_t COLUMNS>
column_iterator<T,ROWS,COLUMNS> column_begin( T (&array[ROWS][COLUMNS]) , std::size_t column )
{
return iterate_column( array , column , 0 );
}
template<typename T , std::size_t ROWS , std::size_t COLUMNS>
column_iterator<T,ROWS,COLUMNS> column_end( T (&array[ROWS][COLUMNS]) , std::size_t column )
{
return iterate_column( array , column , ROWS );
}
:
std::lower_bound( column_begin( foo , 1 ) , column_end( foo , 1 ) , 2 );
( ), 2