【问题标题】:trying to print from ostream but printing a blank instead尝试从 ostream 打印但打印空白
【发布时间】:2013-08-15 07:44:25
【问题描述】:

我有很多日志功能,现在接受ostringstream&。我的目标是让他们能够接受用一行编写的流,如下所示:

MyPrint( ostringstream() << "hello!" << endl);

我无法大幅更改方法原型,因为我有很多仍然可以工作的遗留代码。我想把它改成ostream&amp;,因为那是&lt;&lt;的返回值类型。现在原型的形式是:

void MyPrint( <some parameters>, ostringstream& stream)

阅读此处c++ stringstream to ostream to string 后我建议的更改是(让我们忽略其他参数):

void MyPrint(ostream& stream)
{
    stringstream ss;
    ss << stream.rdbuf();
    cout << "ss is:" << ss.str() << endl;
}

以下行有效:

MyPrint(stringstream().flush() << "hello world!" << endl);

但这会打印一个空白:

ostringstream oss;
oss << "hello world!" << endl;
MyPrint(oss);

(由于某种原因,这实际上可以与 stringstream 一起使用)

第二种形式必须有效,因为这是我的遗留代码的编写方式。

另外,如果我可以避免写像stringstream().flush() 这样不雅的东西,我会喜欢一个解决方案,如果你这样做,该线程中的每个解决方案都可以工作

wrapper() << "string"

但如果你编译则不会编译

wrapper() << "string" << endl

编辑:澄清了我不能破坏的旧原型。

【问题讨论】:

    标签: c++ string stl ostream ostringstream


    【解决方案1】:

    #include <iostream>
    #include <sstream>
    #include <iomanip>
    
    struct MyStream
    {
        mutable std::ostringstream ss;
    
        MyStream() {}
        MyStream(std::ostringstream & oss) { ss << oss.str(); }
    };
    
    typedef std::ostream & (*manipulator_t) (std::ostream &);
    
    const MyStream & operator << (const MyStream & s, manipulator_t m)
    {
        s.ss << m;
        return s;
    }
    
    template <class T>
    const MyStream & operator << (const MyStream & s, T v)
    {
        s.ss << v;
        return s;
    }
    
    void MyPrint(const MyStream & s)
    {
        std::cout << "logged: " << s.ss.str();
    }
    
    int main()
    {
        MyPrint(MyStream() << "true && false == " << std::boolalpha << (true && false) << std::endl);
    
        std::ostringstream oss;
        oss << std::setw(22) << "Hello, World!" << std::endl;
        MyPrint(oss);
    }
    

    在线演示 -> http://ideone.com/Gm7Cnc

    【讨论】:

    • 是否有特定原因使
    • 不,我的习惯是让这些操作符(>)成为非成员函数。您可以将其设为成员函数,这将允许您删除 mutable 和一些 const 限定符。
    【解决方案2】:

    由于您没有得到太多回复,因此我发布了相同的问题并进行了一些更改。幸运的是,我得到了正确的答案。请看HERE

    基本上std::ostringstreamstd::stringbuf 不支持读取,因为传递的标志不同,因此您没有得到任何输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2015-05-18
      • 1970-01-01
      相关资源
      最近更新 更多