2

std::stringstream次のように、またはstd::fstream条件に応じて作成する関数があります。

// Some class, stringStream_ and fileStream_ are members
// obj.Stream() returns std::iostream&
if (condition)
{
    stringStream_.str(std::string());
    obj->Stream().rdbuf(stringStream.rdbuf());
}
else
{
    boost::filesystem::path temp = boost::filesystem::unique_path();
    fileStream_.open(temp.native().c_str(), std::ios_base::trunc | std::ios_base::in | std::ios_base::out);
    obj->Stream().rdbuf(fileStream_.rdbuf());
}

次に、このobjオブジェクトは別のスレッドで処理されるため、この時点で上記の関数がもう一度呼び出される可能性がありstreambufstringStreamリセットされfileStream_、別のファイルに関連付けられているため、新しいファイルを開くことができません。

obj.SetStream()ストリームはコピーできないため、関数のようなものを作成できません。

問題は、オブジェクトがストリームの所有者になるように、std::stringstreamまたはオブジェクトを作成してオブジェクトに渡す方法です (どのタイプのストリームが渡されるかわからないため、std::fstreamオブジェクトストアに注意してください)。std::iostream

前もって感謝します。

4

2 に答える 2

2

std::fstream動的に割り当てられたインスタンスまたはstd::stringstreamへのポインターとして型指定されたインスタンスにポインター (生またはスマート) を渡すことができますstd::iostream。ストリームのクライアントは、それを使用するようなstd::iostream & s = *iostreamPtr; s << "yay!";ことをするだけです。

于 2013-02-05T19:40:32.910 に答える
1

これをテンプレート化された関数にすることができます

template<class T>
void yourFunc(T& object) 
{
  if (typeid(T) == typeid(std::stringstream))
  {
    stringStream_.str(std::string());
    obj->Stream().rdbuf(stringStream.rdbuf());
  }
  else
  {
    boost::filesystem::path temp = boost::filesystem::unique_path();
    fileStream_.open(temp.native().c_str(), std::ios_base::trunc | std::ios_base::in | std::ios_base::out);
    obj->Stream().rdbuf(fileStream_.rdbuf());
  }
}
于 2013-02-05T19:41:13.637 に答える