所以,我開始了一個縮進緩衝區/ ostream,使用操縱器設置縮進級別並遇到問題......第一個是編譯器錯誤 indent_ostream& increase(indent_ostream&)' will always evaluate as 'true'
。只是將函數指針作爲運算符< <作爲ostream的成員。接下來是ambiguous overload for 'operator<<' (operand types are 'indent_ostream' and 'int')
。還增加了一個成員operator < <與模板參數來捕獲所有類型進行流(字符串,整數等)。該結果爲Segmentation fault
,在這裏我:(派生自streambuf,ostream和manip - 沒有編譯或崩潰
#include <iostream>
#include <streambuf>
#include <iomanip>
class indent_sbuf : public std::streambuf
{
std::streambuf* m_sbuf;
std::string m_indent_str;
bool m_start_of_line;
static const int TAB_WIDTH = 4;
public:
explicit indent_sbuf(std::streambuf* sbuf, size_t indent = 0)
: m_sbuf{ sbuf }
, m_indent_str(indent, ' ')
, m_start_of_line{ true }
{ }
~indent_sbuf()
{
overflow('\n');
}
indent_sbuf& increase()
{
m_indent_str = std::string(m_indent_str.size() + TAB_WIDTH, ' ');
return *this;
}
indent_sbuf& decrease()
{
if(m_indent_str.size() > TAB_WIDTH) {
m_indent_str = std::string(m_indent_str.size() - TAB_WIDTH, ' ');
}
else {
m_indent_str = "";
}
return *this;
}
private:
int_type overflow(int_type chr) override
{
if (m_start_of_line && chr != '\n') {
m_sbuf->sputn(m_indent_str.data(), m_indent_str.size());
}
m_start_of_line = (chr == '\n');
return m_sbuf->sputc(chr);
}
};
class indent_ostream : public std::ostream
{
indent_sbuf buf;
public:
indent_ostream(std::ostream& os, size_t width)
: std::ostream(&buf)
, buf(os.rdbuf(), width)
{ }
indent_ostream& operator<<(indent_ostream& (*fcn)(indent_ostream&))
{
return (*fcn)(*this);
}
template<typename T>
indent_ostream& operator<<(T const& v) // get it to compile
{
*this << v; // but crash
return *this;
}
};
static inline
indent_ostream& increase(indent_ostream& os)
{
indent_sbuf* buf = static_cast<indent_sbuf*>(os.rdbuf());
buf->increase();
return os;
}
static inline
indent_ostream& decrease(indent_ostream& os)
{
indent_sbuf* buf = static_cast<indent_sbuf*>(os.rdbuf());
buf->decrease();
return os;
}
int main()
{
indent_ostream os(std::cout, 0);
os << "Hallo\n";
os << increase << "World\n";
os << decrease << 42 << "\n";
}
此外,在coliru。那麼,是什麼會在這裏和那裏是我的缺點如何得到它的工作正確的,符合標準的
良好的經驗法則:如果您收到一條警告,您不明白,請不要匆匆離開您的代碼以使其消失。嘗試瞭解警告。 – Barry
^您可以通過修復編譯器檢測到的問題或者通過對編譯器合理地檢測問題進行檢測來消除編譯器警告。摧毀代碼直到「有效」更有可能導致第二個問題,而不是先嚐試理解代碼。 – jaggedSpire
@jaggedSpire但在SO *上傾銷了一堆代碼確實*工作...有人是**肯定**來一起並提供答案。 –