Можно ли передать iostream в функцию? - PullRequest
0 голосов
/ 14 января 2012

Что я имею в виду:

Всем известен этот метод перенаправления потока на вывод:

cout << "sometext"

но возможно ли передать этот поток в функцию, подобную этой:

my_function() << "sometext";

Ответы [ 5 ]

6 голосов
/ 14 января 2012

Да *:

#include <iostream>
#include <ostream>

std::ostream & my_function() { return std::cout; }

// ...

my_function() << "Hello world.\n";

*) Ничто из того, что вы сказали словами, не является полностью правильным, и вы, возможно, изо всех сил позже будете интегрировать это в свой проект, но этот ответ показывает, как заставить ваш код делать то, что вы хотите.

5 голосов
/ 14 января 2012

Всем известен этот метод перенаправления потока на вывод:

Это не то, что это делает. Поток называется cout; это объект iostream. Оператор << ничего не перенаправляет. Все объекты std::ostream имеют перегруженные функции operator<<. Эти функции вызываются, когда вы используете << с потоком слева и некоторым типом с перегрузкой справа.

<< "sometext" не является «потоком», который может быть «перенаправлен». Это даже не допустимое выражение в C ++. Оператор << является двоичным. это принимает два параметра.

my_function() << "sometext"; может работать, только если он возвращает класс std::ostream или что-то производное от него. Или что-то с определенным для него перегруженным operator<< и const char*.

1 голос
/ 14 января 2012

Если вы ищете способ перегрузить << для своей собственной функции, не связанной с потоками, вот как вы можете это сделать:

struct MyStruct {
    void DoSomething(const string& s);
};

MyStruct &operator<<(MyStruct &x, const string& s) {
   x.DoSomething(s);
   return x;
}

MyStruct& my_function() {
    return MyStruct;
}

int main() {
    my_function() << "Hello, world!";
}

В этом примере DoSomething будет вызвано для экземпляра MyStruct, возвращенного из my_function, и "Hello, world!" будет передано ему в качестве аргумента.

1 голос
/ 14 января 2012
cout << "sometext"

Это не «перенаправление потока на вывод», это вызов функции operator << для объекта cout со строковым литералом «sometext»

если my_function() возвращает ostream с перегрузкой operator <<, то my_function() << "sometext" скомпилирует, иначе произойдет ошибка.

0 голосов
/ 14 января 2012

Если я понимаю, о чем вы спрашиваете, ближайший эквивалент перенаправления оболочки для функции, использующей std::cout для вывода, - это, вероятно, временное переключение внутреннего потокового буфера std::cout на другой.

Конечно, это по своей сути не поточно-ориентированный и не справится, если сама функция ожидает, что std::cout и stdout будут одной и той же базовой вещью.

#include <iostream>
#include <sstream>

int main()
{
    std::stringbuf redir( std::ios_base::out );
    std::streambuf* save = std::cout.rdbuf( &redir );

    my_function(); // cout output ends up in redir

    std::cout.rdbuf( save ); // restore original cout
}
...