【问题标题】:is it possible to pass iostream into a function?是否可以将 iostream 传递给函数?
【发布时间】:2012-01-13 23:58:48
【问题描述】:

我的意思:

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

cout << "sometext"

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

my_function() << "sometext";

【问题讨论】:

  • 你想做什么?您编写的调用 my_function(),并使用“sometext”执行返回值的 operator
  • 你没有“重定向”任何东西,字符串不是流。不要将 C++ 与 shell 混淆。这只是一个函数调用。
  • 将流重定向到输出是什么意思?您的示例只是将"sometext" 写入输出流cout

标签: c++ function parameters iostream


【解决方案1】:

是*:

#include <iostream>
#include <ostream>

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

// ...

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

*) 您所说的一切都不是完全正确的,以后您可能很难将其集成到您的项目中,但这个答案显示了如何让您的代码做您想做的事情。

【讨论】:

  • @MooingDuck:我建议我们让 OP 告诉我们她的需求,而不是试图猜测!
  • 我只是想将流传递给函数并且您的示例有效,但我想知道如何在函数中输出流,因为您只能在最后返回。我尝试通过std::cout &lt;&lt; std::cout; 来做,但我得到:0x6fcc92c4Hello world,如何摆脱这个内存地址?
  • @rsk82:对不起,你的问题真的很不清楚,我根本无法理解你想要达到的目标。我有一个想法,我确信你真正想要的任何东西都可以轻松完成,但我就是无法弄清楚你到底想要什么。您能否修改您的帖子以更具体?也许包括一个更详尽的例子来说明你想要发生的事情(伪代码很好)。
【解决方案2】:

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

那不是这样做的。该流称为cout;那是 iostream 对象。 &lt;&lt; 运算符不会重定向任何内容。 std::ostream 对象都具有重载的operator&lt;&lt; 函数。当您将&lt;&lt; 与左侧的流一起使用时调用这些函数,而右侧的某些类型对其具有重载。

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

my_function() &lt;&lt; "sometext"; 只能在它返回 std::ostream 类或从它派生的东西时工作。或者为它定义了重载的operator&lt;&lt;const char*

【讨论】:

    【解决方案3】:
    cout << "sometext"
    

    这不是“将流重定向到输出”,而是使用字符串文字“sometext”在cout 对象上调用operator &lt;&lt; 函数

    如果my_function() 正在返回一个ostream,其中operator &lt;&lt; 重载,那么my_function() &lt;&lt; "sometext" 将编译,否则它将给出错误。

    【讨论】:

    • 您不能真正“返回ostream”,因为它们a)不可实例化和b)不可复制。
    • 您可以通过引用返回它们,而不是按值返回。
    【解决方案4】:

    如果您正在寻找一种方法为您自己的与流无关的函数重载 &lt;&lt;,您可以这样做:

    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 将在从 my_function 返回的 MyStruct 实例上调用,"Hello, world!" 将作为参数传递给它。

    【讨论】:

      【解决方案5】:

      如果我理解您的问题,对于使用 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        • 2015-05-11
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多