我希望有一些工具可以std::ostream在遇到特殊字符(或特殊物件)時自動識別(或派生)。假設特殊字符是<and >。在這種情況下,以下輸入test0<test1<test2, test3<test4> > >應產生以下輸出:
test0<
test1<
test2,
test3<
test4
>
>
>
一個人將如何實作這一點?
uj5u.com熱心網友回復:
boost::iostreams使這變得相當容易,您可以定義過濾器,然后將它們與輸出流鏈接在一起,以將輸入轉換為所需的輸出:
#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
namespace io = boost::iostreams;
struct QuoteOutputFilter {
typedef char char_type;
typedef io::output_filter_tag category;
int indent = 0;
template<typename Sink>
bool newLine(Sink& snk)
{
std::string str = "\n" std::string(indent * 4, ' ');
return io::write(snk, str.c_str(), str.size());
}
template<typename Sink>
bool put(Sink& snk, char c)
{
switch (c)
{
case '<':
io::put(snk, c);
indent = 1;
return newLine(snk);
case ',':
io::put(snk, c);
return newLine(snk);
case '>':
indent -= 1;
newLine(snk);
return io::put(snk, c);
default:
return io::put(snk, c);
}
}
};
int main()
{
io::filtering_ostream out;
out.push(QuoteOutputFilter());
out.push(std::cout);
out << "test0<test1<test2, test3<test4> > >";
}
uj5u.com熱心網友回復:
std::ostream? IOStream 設計相當復雜(而且有點慢),所以我明白你為什么會這樣想。這個名字ostream聽起來像是一個很好的提示,但實際上并沒有多大作用。它確實通過系結std::ostreambuf和operator<<多載一起作業。派生ostream類提供具體的流緩沖區。
你想要的可能是一個streambuf過濾器。你抓取底層的流緩沖區,并將其用作輸出,但是當你看到一個>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425972.html
上一篇:pybind11-回傳std::vector的shared_ptr
下一篇:對新關鍵字進行Gtest
