2013-02-05 61 views
2

我有一个创建取决于条件std::stringstreamstd::fstream,像一个函数:分享的std :: fstream的或std :: stringstream的槽的std ::的iostream

// 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对象在另一个线程处理,所以此时上述功能可能会再次被调用,并且streambuf将在stringStream中被重置,fileStream_将无法​​打开新文件,因为它与另一个文件相关联。

我不能制作像obj.SetStream()这样的功能,因为数据流是不可复制的。

的问题是:我怎么可以制作std::stringstreamstd::fstream,它使对象成为流的所有者(注意对象存储std::iostream因为它不知道什么类型的流将被传递)传递给目标。

在此先感谢。

回答

2

您可以将指针(原始或智能)传递到动态分配的实例std::fstreamstd::stringstream,该实例键入为指向std::iostream的指针。流的客户端只需要执行一些操作,如std::iostream & s = *iostreamPtr; s << "yay!";即可使用它。

+0

是合法的写类似'的boost :: shared_ptr的<的std :: iostream的>流(新的std :: stringstream的)'? – maverik

+0

@maverik:是的,是的,AFAIK。 – wilx

+0

看起来像这个解决方案解决了这个问题。我会尽力。感谢您的回应。 – maverik

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

要么我对问题的解释不好,要么你不明白这个问题。不管怎么说,还是要谢谢你 – maverik

相关问题