1

我目前正在为 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()方法,但只能使用. 并且还需要很多其他的东西,比如s 和s。<<Synchronizestd::stringstd::stringstreamintfloat

Synchronize是否可以在没有大量自己功能的情况下将此功能添加到我的课程中operator<<?模板有帮助吗?或者我应该从iostream图书馆扩展一些类?

4

2 回答 2

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;
}
于 2013-02-07T13:42:54.247 回答
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对象时,它会锁定 a mutex(与其他synchronize_begin实例共享)并写入out)。

或者:

std::ostream  out; // any std::ostream type
out << synchronized << "this is " << " a test"; // synchronized ends here

(同步是一个缓冲区实例,它在行尾退出范围;当它被写入 out 时,它会锁定,然后写入它的数据。

于 2013-02-07T14:22:20.810 回答