Если вы хотите эмулировать манипуляторы наподобие cout << setw(8) << …
, для этого нет стандартного средства, и это невозможно сделать только с помощью функции.
Манипуляторы, принимающие аргументы, являются фабричными функциями, которые создают специальные функторы. Возвращенный объект запоминает параметр для манипулятора и реализует operator<<
для его использования.
В примере кода есть два отдельных подхода.
cout<<info<<M; // info changes cout somehow?
и
ostream& info(ostream& os,matrix<T2> &cMatrix) // info behaves like operator<<?
Первый подход, добавление состояния к cout
, возможен, но слишком сложен для этого.
Второй подход напрашивается на вопрос, почему вы не просто называете это operator<<
и все готово.
Альтернативно, вы можете позвонить второму напрямую: info(cout << "hello", M) << "world";
Если вы ищете синтаксис cout << info(M)
, который больше похож на манипулятор, вам нужно что-то вроде
struct print_info {
Matrix &m;
print_info( Matrix &in ) : m(in) {}
friend ostream &operator<<( ostream &str, print_info const &pi ) {
str << pi.m.getcols();
…
}
};
print_info info( Matrix &in )
{ return print_info( in ); }
Строго говоря, эта функция не нужна, но лучше не давать классу с такой специфической функцией такое общее имя, как info
.
Но опять же, все это не нужно. Просто используйте переопределение <<
, которое у вас есть.