我如何在std :: stringstream中重载<<

时间:2018-06-24 22:25:25

标签: c++ c++11

我有下面显示的课程。我曾经能够创建一个StrStrmBuf对象,然后像这样将其传递给std :: cout:

#using namespace std;
StrStrmBuf ssb("Hello");
cout << ssb << endl << endl;

但是对于C ++ 11,我必须这样做。

StrStrmBuf ssb("Hello");
cout << ssb.str() << endl << endl;

由于

,我认为我可以使用第一种形式
operator const char*() { return str().c_str(); }

,但它似乎无法与C ++ 11一起使用。我一直在尝试重载<<操作符,但没有成功。 (请参见清单末尾显示的非成员<<重载。)有人可以建议我应该如何为此类实现<< <<重载吗?我想简单地说cout << ssb;谢谢。

#define SSB_OPEN_MODE std::ios_base::out|std::ios_base::in|std::ios_base::ate
class StrStrmBuf : public std::stringstream
{
public:
    explicit StrStrmBuf() : std::stringstream(SSB_OPEN_MODE)    {}
    explicit StrStrmBuf(const std::string& str) :
    std::stringstream(str, SSB_OPEN_MODE)           {}
    explicit StrStrmBuf(const char* pStr) :
    std::stringstream(pStr, SSB_OPEN_MODE)          {}
    template <typename T>
    StrStrmBuf(const std::string& str, T const param) :
        std::stringstream(str, SSB_OPEN_MODE)  { *this << param; }
    StrStrmBuf(StrStrmBuf& rhs)                { str(rhs.str()); }
    StrStrmBuf& putch(char ch, size_t nCount = 1);
    StrStrmBuf& putstr(const std::string& str);

    StrStrmBuf& width(int nCol)
        { std::ios_base::width(nCol); return *this; }
    StrStrmBuf& clear()         { str(""); return *this;  }
    size_t length() const           { return str().length();  }
    bool empty() const          { return str().length() == 0; }
    StrStrmBuf& operator=(const std::string& s) { str(s); return *this; }
    StrStrmBuf& operator=(const char* s)        { str(s); return *this; }
    StrStrmBuf& operator=(StrStrmBuf& rhs);
    operator const char*()                      { return str().c_str(); }
    operator const std::string()                { return str();         }

    StrStrmBuf& ltrim();
    StrStrmBuf& rtrim();
    StrStrmBuf& trim();

    StrStrmBuf& lpad(const std::string& s, size_t nSize, char ch = ' ');
    StrStrmBuf& rpad(const std::string& s, size_t nSize, char ch = ' ');
    StrStrmBuf& center(const std::string& s, size_t nSize, char ch = ' ');
    };

    const char* operator<<(std::ostream& out, StrStrmBuf& rhs) 
    { return      rhs.str().c_str(); }

0 个答案:

没有答案