是否有可能将iostream传递给函数?

时间:2012-01-13 23:58:48

标签: c++ function parameters iostream

我的意思是:

每个人都知道这种将流重定向到输出的方法:

cout << "sometext"

但是可以将该流传递给这样的函数:

my_function() << "sometext";

5 个答案:

答案 0 :(得分:6)

是*:

#include <iostream>
#include <ostream>

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

// ...

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

*)你用语言说的任何内容都是完全正确的,你可能很难将其集成到你的项目中,但这个答案显示了如何让你的代码做你想做的事。

答案 1 :(得分:5)

  

每个人都知道这种将流重定向到输出的方法:

这不是那样做的。该流称为cout;这是iostream对象。 <<运算符不会重定向任何内容。 std::ostream个对象都有重载operator<<个函数。当您在左侧使用带有流的<<时,会调用这些函数,而在右侧则使用某种类型的超载。

<< "sometext"不是可以“重定向”的“流”。它甚至不是C ++中的有效表达式。 <<运算符是二进制的。它需要两个参数。

my_function() << "sometext";只有在返回std::ostream类或从中派生的内容时才能工作。或者为其定义了重载operator<<的内容以及const char*

答案 2 :(得分:1)

cout << "sometext"

这不是“将流重定向到输出”它使用字符串文字“sometext”调用operator <<对象上的cout函数

如果my_function()返回的ostreamoperator <<重载,那么my_function() << "sometext"将编译其他内容会产生错误。

答案 3 :(得分:1)

如果您正在寻找一种方法来为您自己的与流无关的功能重载<<,请按以下步骤操作:

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!";
}

在此示例中,将DoSomethingMyStruct返回的my_function实例上调用"Hello, world!",{{1}}将作为参数传递给它。

答案 4 :(得分:0)

如果我理解你的问题,那么使用std::cout输出的函数的shell重定向的最接近的等价物可能是暂时切换std::cout的内部流缓冲区以用于另一个

当然,这本质上不是线程安全的,如果函数本身期望std::coutstdout是相同的基础事物,则无法应对。

#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
}