2016-10-17 8 views
0

は、誰もが<<でそれに渡されたパラメータのいずれかの仕事をして回避ヌルstd::ostringstreamを持つ方法を提案することはできますか?:: ostringstream :: ostringstream参照

ここでは二つの関連記事Implementing a no-op std::ostreamPrinting to nowhere with ostreamは、これまで最も有望な解決策はhttps://stackoverflow.com/a/760353/826203ですが、テストしながら、それは

int main() { 
    onullstream os; 
    os << 666; 

// std::ostringstream & oss = os; // error C2440: 'initializing' : cannot convert from 'onullstream' to 'std::ostringstream &' 
    oss << "hello, world"; 
} 

しかし、これが唯一のos<<666のように使用することができますが、ないすることは可能性がありますが、 std::ostringstream &として使用されます。ここに出る?

+1

あなたがエラーを取得する:あなたの既存のインタフェースを既にstd::ostringstreamを取る場合は、std::ostringstreamから派生し、適切なストリームバッファを設定することにより、AAヌル・ストリームを作成することができます継承ツリー。両方とも 'std :: ostream'から継承しますが、それ以外は無関係です。代わりに、私は 'std :: ostringstream'をここで使う必要はないと思います。あなたが本当に必要としないものです。たとえば、ストリームで呼び出す関数があれば、 'std :: ostream'リファレンスを取ります。次に、 'std :: ostringstream'オブジェクト*または' onullstream'オブジェクトを渡すことができます。 –

答えて

3

非稼動ストリームを作成する最も簡単な方法は、実際にカスタムストリームクラスを作成するのではなく、既存のストリームを無効にすることです。たとえば、あなたはnullにそのストリームバッファを設定することにより、std::ostreamに書式を無効にすることができます。

std::ostringstream out; 
out.std::ostream::rdbuf(0); 
// any attempt to write anything to out will fail. 

あなたが成功したデータをフォーマットするために失敗したストリームを必要とする場合は、任意のバイトが格納されていないストリームバッファを作成することができますし、常に成功しています。このストリームは、バッファ使用している場合しかし、実際に実行されます書式設定:私もの機能を持つようにない推薦

struct nullbuf: std::streambuf { 
    std::streambuf::int_type overflow(std::streambuf::int_type c) { 
     return std::char_traits<char>::not_eof(c); 
    } 
}; 
// ... 
nullbuf   buf; 
std::ostringstream out; 
out.std::ostream::rdbuf(&buf); 

注意引数としてstd::ostringstreamを取ります。代わりに、ストリームを構成しない関数は、std::ostream&という形で移動する必要があります。の異なる部分があるonullstream` ``ためのstd :: ostringstream`と

class onullstream 
    : private virtual nullbuf 
    , public std::ostringstream { 
public: 
    nullstring() 
     : std::ios(this) 
     , std::ostringstgream() { 
     this->std::ostream::rdbuf(this); 
    } 
}; 
+0

ありがとうございます!実際に書式設定が行われるということと、2) 'std :: ostringstream'を引数として取らず、' std :: ostream& 'を取るこ​​とを推奨する理由は何ですか? – athos

+0

@athos:申し訳ありませんが、派生したストリームに 'rdbuf()'のオーバーロードがあることを忘れています(誤っています)。 'out :: std :: ostream :: rdbuf(&buf)'のように関数の 'std :: ios'バージョンへの呼び出しを指示してください(他のバージョンと同様)。 –

+0

@athos:あなたの他の質問に関して:1. 'nullbuf'はそれに送られたすべての文字を単純に食べます。しかし、成功しているため、すべての文字が生成されます。つまり、 'int 'を挿入すると' int'は 'int'の値を表す' char'のシーケンスに変換され、 'char'sは使用されません。つまり、文字を無視するだけで大​​量の作業が行われる可能性があります。ストリームをかなり強制的に無効にする、すなわちストリームバッファを「0」に設定すると、ストリーム操作は値を変換せずにすべての操作が失敗する。 –

関連する問題