Как создать манипулятор с параметрами
От: RobinBobin  
Дата: 25.05.04 10:13
Оценка:
Есть мой класс, в котором определены перегруженные операторы вывода. Нужно, чтобы мой класс понимал и манипуляторы.

Спасибо.
Re: Как создать манипулятор с параметрами
От: jazzer Россия Skype: enerjazzer
Дата: 25.05.04 10:16
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>Есть мой класс, в котором определены перегруженные операторы вывода. Нужно, чтобы мой класс понимал и манипуляторы.


Манипуляторы манипулируют состоянием потока, в который ты пишешь в своем перегруженном операторе вывода.
Тебе нужно считывать состояние потока и соответственно менять свой вывод.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как создать манипулятор с параметрами
От: Кодт Россия  
Дата: 25.05.04 10:33
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>Есть мой класс, в котором определены перегруженные операторы вывода. Нужно, чтобы мой класс понимал и манипуляторы.


Делается это примерно так:
class TheStream
{
public:
  // ручки манипулирования
  void foo();
  void bar();
};

class TheStreamManip
{
public:
  TheStreamManip(ctor-args) {...}

  void process(TheStream& ts) const {...}
};

TheStream& operator<< (TheStream& ts, const TheStreamManip& tsm)
{
  tsm.process(ts);
  return ts;
}
Перекуём баги на фичи!
Re[2]: Как создать манипулятор с параметрами
От: RobinBobin  
Дата: 25.05.04 10:43
Оценка:
Здравствуйте, Кодт, Вы писали:

Спасибо. И это всё? И никаких подводных камней? Не верю
Re[2]: Как создать манипулятор с параметрами
От: RobinBobin  
Дата: 25.05.04 10:53
Оценка:
Здравствуйте, Кодт, Вы писали:

...

И, кстати говоря, почему манипуляторы в <iomanip> / <iomanip.h> определены таким извращенским способом? Похоже, это функции, а не классы?
Re[3]: Как создать манипулятор с параметрами
От: Кодт Россия  
Дата: 25.05.04 11:05
Оценка:
Здравствуйте, RobinBobin, Вы писали:

RB>И, кстати говоря, почему манипуляторы в <iomanip> / <iomanip.h> определены таким извращенским способом? Похоже, это функции, а не классы?


Потому что перегрузка и шаблоны умеют много разных гитик

Для манипуляторов без параметров (таких как std::endl) достаточно сделать так:
void simple_manipulator1(TheStream& ts)
{ . . . }

void simple_manipulator2(TheStream& ts)
{ . . . }

// общий оператор

TheStream& operator<< (TheStream& ts, void(*pfn)(TheStream&))
{
  pfn(ts);
  return ts;
}

main()
{
  ...
  ts << "hello" << simple_manipulator1 << "world" << endl;
}

Для манипуляторов с параметрами — нужно эти параметры связывать (конструировть объекты). Тут обширное поле для разных изысков, включая std::bind1st, boost::bind, boost::function и т.п.
Перекуём баги на фичи!
Re[3]: Как создать манипулятор с параметрами
От: Vamp Россия  
Дата: 25.05.04 11:06
Оценка:
RB>И, кстати говоря, почему манипуляторы в <iomanip> / <iomanip.h> определены таким извращенским способом? Похоже, это функции, а не классы?
Почему извращенским? Это функции, возвращающие классы.
Просто если делать так, как предложил Кодт, то тебе понадобиться либо столько операторов <<, сколько у тебя есть манипуляторов (+ все остальные), либо придется воспользоваться наследованием.
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.