パラメータとしてストリングストリームとアウトストリームを許可する

I'm trying to write a function that writes information to a stream. I need to be able to pass it either a stringstream or an ostream. I tried declaring the function with F(std::ios* out), but then later when I use the << operator to write to it, I get this error: error: no match for operator<<. How should I be declaring the function?

0

3 答え

I think you are looking for c++ references

void F(std::ostream& out)
{
}

そのトリックをするだろう。これは char ストリームを前提とします。

template  */>
    void F(std::basic_ostream& os)
{
}
7
追加された
追加された 著者 ildjarn,
Traits テンプレートパラメータもあります。
追加された 著者 K-ballo,
C ++では、デフォルトのテンプレート引数は使用できますが、引数は常にストリームの引数と一致する必要があるため、ここではそれらを使用する必要はありません。
追加された 著者 K-ballo,
@ildjarn:ありがとう。私はそれをmisremembered :)
追加された 著者 sehe,
@ K-ballo:正に注目された。今では、デフォルトのテンプレート引数がC ++ 11の関数に許可されるかもしれないと思ったのはどこですか?
追加された 著者 sehe,
@ K-ballo:良い点。 @ ildjam、リンクありがとう
追加された 著者 sehe,

First of all, you should probably pass a reference to the stream, because otherwise you'll have to write (*out)<< to make the insertion operator work correctly (it works on streams, not on pointer to streams).

しかし、もっと重要なのは、 std :: iOS はストリームの基本クラスの1つ、つまり、テンプレートパラメータに依存しないIOクラスのメンバーを含むものです。

一般的な出力ストリームを受け取る場合は、 std :: ostream char ベースストリームの場合)または std :: wostream wchar_t ベースのストリームの場合)。ジェネリックにしたい場合は、 char_type char_traits の関数テンプレートを std :: basic_ostreamクラスしかし、文字型に依存しないコードを書くことはしばしば単純ではなく、必要がない場合は、努力する価値がないかもしれません - いくつかの TCHAR のような戦略を使うことをお勧めします。

だから、おそらくあなたが望むのは:

F(std::ostream & out)

(入力ストリームの場合はまったく同じですが、 std :: istream / std :: wistream / std :: basic_istream

2
追加された

stringstream is an ostream. Generic I/O functions should generally take either ostream or istream as a reference.

void fun(std::ostream& out);

これは stringstream fstream のような他の ostream サブクラスの両方で動作します。

2
追加された
I/O関数は、ストリームの文字と特性タイプを制限するのではなく、 basic_ostream または basic_istream <> を参照として使用する必要があります。
追加された 著者 ildjarn,
@ildjarn:一方、 char_type の文字列を書く必要がある場合、IOはすぐに混乱するので、努力する価値がないかもしれません( TCHAR より容易に実施することができる)。
追加された 著者 Matteo Italia,