Переделать 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 шт):
Во-первых, вам не нужно хранить размеры 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().