Переделать Utility function

Имеется функция с перегрузкой оператора << для вывода элементов вектора векторов в консоль. Могли бы вы посоветовать, как переписать эту функцию, если элементы вектора векторов являются целочисленной, следовательно, нужно сделать это без шаблонной функции. Возможно, вопрос глуп, но я новичок в программировании, поэтому интересуюсь, как такое сделать. Кому не тяжело, помогите, пожалуйста.

/* Utility function to print Matrix */
template<template <typename, typename...> class Container,
                   typename T,
                   typename... Args>

//disable for string, which is  basic_string<char>, a container itself
typename enable_if<!is_convertible<Container<T, Args...>, string>::value &&
                        !is_constructible<Container<T, Args...>, string>::value,
                            ostream&>::type
operator<<(ostream& os, const Container<T, Args...>& con)
{
    os << " ";
    for (auto& elem: con)
        os << elem << " ";

    os << "\n";
    return os;
}

class Matrix{
    public:
        Matrix operator+(Matrix);
        Matrix operator-(Matrix);
        friend ostream& operator<<(ostream &out,Matrix x);
        friend istream& operator>>(istream &in,Matrix x);
private:
        vector< vector<int> > arr;
        int n,m;
};
 
ostream& operator<<(ostream &out,Matrix x){
    for(int i=0;i<x.n;i++){
        for(int j=0;j<x.m;j++)
            out<<x.arr[i][j]<<" ";
        out<<endl;
    }
    out<<x.m<<" "<<x.n;
return out;
}

Ответы (1 шт):

Автор решения: Harry

Во-первых, вам не нужно хранить размеры n, m отдельно — они есть в arr.

Во-вторых, для доступа к закрытым членам Matrix оператор нужно делать другом класса - тут вы написали совершенно верно, только вот матрицу передавать по значению не стоит:

friend oatream& operator<<(ostream&out, const Matrix& m);

А дальше все просто:

ostream& operator<<(ostream &out, const Matrix& m)
{
    for(int i = 0; i < m.arr.size(); ++i)
    {
        for(int j = 0; j< m.arr[i].size(); ++j)
            out << m.arr[i][j] << " ";
        out << endl;
    }
    return out;
}

Собственно, это все. Практически как у вас.

Можно разве что приукрасить вывод — например, добавив ширину поля вывода setw().

→ Ссылка