我正在编写STL流的包装器来同步来自多个线程的写调用。我有以下(简化)代码:
class Synchronize {
private:
std::stringstream ss;
public:
void write(std::string& str) {
// locking ...
ss << str;
// unlocking ...
};
// other stuff ..
};
Synchronize& operator<<(Synchronize& o, std::string& str) {
o.write(str);
return o;
}
Synchronize& operator<<(Synchronize* o, std::string& str) {
o->write(str);
return *o;
}
现在可以在write()
类的对象上使用<<
运算符调用Synchronize
方法,但只能使用std::string
。而std::stringstream
也需要很多其他内容,例如int
和float
s。
是否可以在没有大量自有Synchronize
功能的情况下将此功能添加到operator<<
课程中?模板有用吗?或者我应该从iostream
库扩展一些课程?
答案 0 :(得分:3)
您可以将操作员过载转换为朋友模板
在课堂上写
template<typename T>
friend Synchronize& operator<<(Synchronize& o, T const& t);
然后定义可能是
template<typename T>
Synchronize& operator<<(Synchronize& o, T const& t) {
o.write(t);
return o;
}
//edit
template<typename T>
void Synchronize::write(T& t)
{
ss << t;
}
答案 1 :(得分:0)
如果我理解正确,你想让很多读者进入一个目的地。您创建的体系结构(带有同步/锁定写入的std :: stream上的包装器)不是一个好的解决方案。
这里的代码无法正常运行:
Synchronize your_stream;
void thread_function1()
{
output << "this is a message " << "from thread_function1\n";
}
void thread_function2()
{
output << "this is a message " << "from thread_function2\n";
}
使用您的代码,输出可能是:
this is a message this is a message from thread_function2
from thread_function1
您需要的是能够随时随地设置同步点的能力:
your_stream out;
out << synchronize_begin << "this is " << " a test" << synchronize_end;
(这会缓存synchronize_begin
对象中的所有内容(可以转储到流中),当它收到synchronize_end
个对象时,会锁定mutex
(与其他{{共享) 1}}实例)并写入synchronize_begin
)。
或:
out
(synchronized是一个缓冲区实例,它在该行的末尾退出范围;当它被写入时,它会锁定,然后写入它的数据。