我有下面显示的课程。我曾经能够创建一个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(); }