Вы можете вернуть временный объект, который содержит первый индекс и имеет ссылку на источник данных.
private:
class BoundArg {
private:
Data& data;
size_t i;
public:
BoundArg (etc.)
value_type& operator [] ( size_t j ) {
return data.get ( i, j );
}
};
public:
value_type& get ( size_t i, size_t j ) ...
BoundArg operator [] ( size_t i )
{
return BoundArg ( *this, i );
}
Обычно это не стоит сложности, если только у вас нет двумерного массива, хранящегося как одномерный массив, в этом случае временный является просто указателем куда-то в массив.
public:
value_type& get ( size_t i, size_t j ) {
return data_ [ i * rowWidth_ + j ];
}
value_type* operator [] ( size_t i )
{
return data_ + i * rowWidth_;
}