Форум программистов, компьютерный форум CyberForum.ru

Что такое потоковые манипуляторы - C++

Восстановить пароль Регистрация
 
thick_int
Заблокирован
28.04.2012, 18:48     Что такое потоковые манипуляторы #1
Как то удивительно странно все авторы обходят стороной вопрос, что такое потоковые манипуляторы, как то endl, setw, dec и так далее.
Чем же они являются. Может быть это особые значения, вряд ли. Может быть это особые фуункци.

Так все таки, к какой сущности C++ следует относить эти манипуляторы.

Одним словом, как применять их более-менее понятно, а что же это такое - совершенно непонятно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2012, 18:48     Что такое потоковые манипуляторы
Посмотрите здесь:

Потоковые классы C++
"потоковые переменные"... или что-то в этом роде... C++
манипуляторы C++
C++ потоковые классы
Манипуляторы. От С к С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.04.2012, 20:49     Что такое потоковые манипуляторы #2
Manipulators are functions specifically designed to be used in conjunction with the insertion (<<) and extraction (>>) operators on stream objects
http://cplusplus.com/reference/iostream/manipulators/
thick_int
Заблокирован
28.04.2012, 21:58  [ТС]     Что такое потоковые манипуляторы #3
Не густо однако.
Ну что ж, будем считать пока, что, что такое потоковые манипуляторы - это тайна C++, покрытая глубоким мраком.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.04.2012, 22:49     Что такое потоковые манипуляторы #4
по ссылке то, что доктор прописал.
по сути - это настройщики потоков.
запись stream << manipulator;
приводит к вызову функции manipulator, которой передается этот самый поток. А она, эта функция, настраивает этот поток каким-то образом или выводит в поток что-то (рефрешит поток, настраивает формат вывода определенных типов, заставляет ингорировать какие-то символы и т.п.).
thick_int
Заблокирован
28.04.2012, 22:53  [ТС]     Что такое потоковые манипуляторы #5
Ну, я не могу понять в чем суть тогда вот такого оператора (он кстати вполне легален)

C++
1
cout << endl(cout);
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.04.2012, 22:58     Что такое потоковые манипуляторы #6
запись
endl(cout);
эквивалентна
cout << endl;

cout << endl(cout); - это несколько другое. это вызов endl(cout) и запись в поток результата этого вызова.
рассматривайте запись cout << endl как синтаксический сахар. ведь много чего в поток суется именно таким образом. поэтому более привычно выглядит именно так.

и еще возможно это более корректно. раз endl что-то возвращает, может оказатся так, что в функции
C++
1
2
3
4
5
6
ostream& operator << (ostream s&, manupulator m)
{
   sometype result = m(s);
   // result как-то используется. надо в исходники смотреть что там происходит
   return s;
}
thick_int
Заблокирован
28.04.2012, 23:05  [ТС]     Что такое потоковые манипуляторы #7
Ну вообщем выяснили пока, что манипуляторы - это функции.
Осталось только понять, где то свойство C++, которое позволяет этим функциям применяться вот в такой форме, то есть без аргументов, как с endl, или не со всеми аргументами (для параметрических манипуляторов).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.04.2012, 23:17     Что такое потоковые манипуляторы
Еще ссылки по теме:

C++ ПОТОКОВЫЕ КЛАССЫ С++
Потоковые и обратные итераторы C++
C++ Потоковые итераторы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
28.04.2012, 23:17     Что такое потоковые манипуляторы #8
ну в дебаге же можно посмотреть. все работает за счет правильной перегрузки оператора << для потока:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
std::cout << std::endl;
приводит к вызову
_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
{ // call basic_ostream manipulator
  _DEBUG_POINTER(_Pfn);
  return ((*_Pfn)(*this));
}
т.е. это была перегрузка оператора для указателя на функцию определенной сигнатуры.
 
вызов
std::cout << std::setw(10);
 
приводит к другой перегрузке:
template<class _Elem,
    class _Traits,
    class _Arg> inline
    basic_ostream<_Elem, _Traits>& __CLRCALL_OR_CDECL operator<<(
        basic_ostream<_Elem, _Traits>& _Ostr, const _Smanip<_Arg>& _Manip)
    {   // insert by calling function with output stream and argument
    (*_Manip._Pfun)(_Ostr, _Manip._Manarg);
    return (_Ostr);
    }
 
потому что фозвращаемый тип функции std::setw(streamsize)
какой-то такой:
_Smanip<_Arg> - а эта объект, которому при построении передали размер.
вот примерно таким макаром все и работает. за счет перегрузки функций.
Yandex
Объявления
28.04.2012, 23:17     Что такое потоковые манипуляторы
Ответ Создать тему
Опции темы

Текущее время: 17:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru