2012-04-04 60 views
3

是否有可能在不使用std::ostringstream::str()成员函数创建std::string进行搜索时搜索std::ostringstream的内容?查询标准:: ostringstream内容

我有以下的,并希望避免对flush_()每次调用构造std::string实例:

#include <iostream> 
using std::cout; 

#include <ios> 
using std::boolalpha; 

#include <sstream> 
using std::ostringstream; 

#include <string> 
using std::string; 

class line_decorating_ostream 
{ 
public: 
    line_decorating_ostream() { out_ << boolalpha; } 
    ~line_decorating_ostream() { cout << out_.str(); } 

    template <typename T> 
    line_decorating_ostream& operator<<(const T& a_t) 
    { 
     out_ << a_t; 
     flush_(); 
     return *this; 
    } 

private: 
    ostringstream out_; 
    line_decorating_ostream(const line_decorating_ostream&); 
    line_decorating_ostream& operator=(const line_decorating_ostream&); 

    // Write any full lines. 
    void flush_() 
    { 
     string s(out_.str()); 
     size_t pos = s.find('\n'); 
     if (string::npos != pos) 
     { 
      do 
      { 
       cout << "line: [" << s.substr(0, pos) << "]\n"; 
       s = s.substr(pos + 1); 

      } while (string::npos != (pos = s.find('\n'))); 

      out_.clear(); 
      out_.str(""); 
      out_ << boolalpha << s; 
     } 
    } 
}; 

int main() 
{ 
    line_decorating_ostream logger; 

    logger << "1 " << "2 " << 3 << " 4 " << 5 << "\n" 
      << "6 7 8 9 10\n...\n" << true << "\n"; 

    return 0; 
} 

[它不会导致我很在意,只是好奇任何性能问题,如果这是可能的。]

回答

4

使用它的streambuf类?或者写一个自己的? (OK:你应该写一个自己的一个:pbasepptr保护)

class my_str_buffer : public basic_stringbuf<char> 
{ 
    public: 
    using basic_stringbuf<char>::pbase; 
    using basic_stringbuf<char>::pptr; 
}; 

my_str_buffer my_buf; 
ostream str(&my_buf); 
// do anything 
string foo(str.rdbuf()->pbase(), str.rdbuf()->pptr()); 

ostream constructorstringbuf

+0

+1谢谢。只需要注意我必须使用'dynamic_cast (str.rdbuf())'来访问'pbase'和'pptr'。 – hmjd 2012-04-04 14:00:46