Универсальная функция печати - PullRequest
0 голосов
/ 30 октября 2011

У меня под рукой нет хорошей книги по C ++, и Google не выдает ничего полезного.

Как это работает? Концептуально, что здесь происходит? Технически, является ли прототип для оператора << () предопределенным, как его автор знал, как записать его, чтобы << был перегружен для вывода значений контейнера? </p>

Куда мне обратиться, чтобы посмотреть на operator<<(), чтобы я мог его перегрузить?

Также для ввода вам нужны начальное и конечное "место" c.begin(), c.end() ... но для вывода вам нужно одно "место" ostream_iterator. Это кажется немного асимметричным.

template <typename Container> 
std::ostream& operator<<(std::ostream& os, const Container& c) 
{ 
    std::copy(c.begin(), c.end(),  
              std::ostream_iterator<typename Container::value_type>(os, " ")); 
    return os; 
}

1 Ответ

1 голос
/ 30 октября 2011

Это довольно расплывчато, но я попробую:

Технически, это предопределенный прототип для оператора << (), откуда его автор знал, как его написатьтак что << перегружено для вывода значений контейнера? </p>

Куда мне обратиться, чтобы посмотреть на оператор << (), чтобы я мог его перегрузить? </p>

Вы можете перегрузить операторыдля всех пользовательских типов, для которых они еще не перегружены.См. здесь для получения дополнительной информации об этом.

Также для ввода вам нужны начальное и конечное "место" c.begin (), c.end () ... но для вывода вам нужен один "место" ostream_iterator.Это кажется немного асимметричным.

Принимая это как вопрос ...
Вот как определяется std::copy(): он принимает входной диапазон (определенный итераторами начала и конца), ивыходной итератор для того, где писать.Предполагается, что там, где он пишет, достаточно места.(Если вы возьмете оператор выходного потока, там всегда будет достаточно места.)

Возможно, вы захотите получить хорошую книгу по C ++ .

...