2

我有一个创建std::stringstreamstd::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::stringstreamstd::fstream将其传递给对象,以便对象成为流的所有者(注意对象存储std::iostream,因为它不知道将传递哪种类型的流)。

提前致谢。

4

2 回答 2

2

您可以将指针(原始或智能)传递给动态分配的任一实例std::fstreamstd::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 回答