【问题标题】:Share std::fstream or std::stringstream trough std::iostream通过 std::iostream 共享 std::fstream 或 std::stringstream
【发布时间】:2013-02-05 19:36:10
【问题描述】:

我有一个函数可以根据条件创建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对象在另一个线程中被处理,所以此时上面的函数可能会被再次调用并且stringStream中的streambuf将被重置并且fileStream_将无法打开新文件,因为它与另一个相关联。

我无法创建像 obj.SetStream() 这样的函数,因为流是不可复制的。

问题是:我如何创建std::stringstreamstd::fstream 并将其传递给对象,以便对象成为流的所有者(注意对象存储std::iostream,因为它不知道什么类型流将被传递)。

提前致谢。

【问题讨论】:

    标签: c++ stream c++03


    【解决方案1】:

    您可以将指针(原始或智能)传递给动态分配的std::fstreamstd::stringstream 实例,类型为指向std::iostream 的指针。然后,流的客户端只需执行std::iostream & s = *iostreamPtr; s << "yay!"; 之类的操作即可使用它。

    【讨论】:

    • boost::shared_ptr<std::iostream> stream(new std::stringstream)这样的东西合法吗?
    • @maverik:是的,AFAIK。
    • 看起来这个解决方案解决了这个问题。我会尽力。感谢您的回复。
    【解决方案2】:

    你可以把它变成一个模板函数

    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());
      }
    }
    

    【讨论】:

    • 要么我对问题的解释不好,要么你不理解问题。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多