web-dev-qa-db-ja.com

文字列ストリームを関数パラメーターとして渡すことは可能ですか?

文字列ストリームを渡して、関数に直接書き込むことは可能ですか?

次のような関数が呼び出されたのを見たのを覚えています。

my_func(ss << "text" << hex << 33);
21
rsk82

確実なこと。なぜそうではないのですか?このような関数の宣言例:

void my_func(std::ostringstream& ss);
21
eq-

絶対に!値ではなく、参照によって渡すようにしてください。

void my_func(ostream& stream) {
    stream << "Hello!";
}
10
dasblinkenlight

my_funcには、次の行に沿って署名が必要です。

void my_func( std::ostream& s );

、それはss << "text" << hex << 33のタイプだからです。生成された文字列を抽出することが目標である場合は、次のようなことを行う必要があります。

void
my_func( std::ostream& s )
{
    std::string data = dynamic_cast<std::ostringstream&>(s).str();
    //  ...
}

一時的なストリームは使用できないことにも注意してください。

my_func( std::ostringstream() << "text" << hex << 33 );

正当なC++ではないため、コンパイルされません(VC++を使用する場合を除く)。次のように書くことができます:

my_func( std::ostringstream().flush() << "text" << hex << 33 );

一時的に使用したい場合。しかし、それはあまりユーザーフレンドリーではありません。

3
James Kanze

はい、そうです、そして

Function(expresion)

最初に評価される式を作成し、その結果をパラメーターとして渡します。

注: 演算子<< for ostreams はostreamを返します

1
Mario Corchero