STL流的包装类:前向运算符<<电话

时间:2013-02-07 13:39:46

标签: c++ stl wrapper operator-keyword

我正在编写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也需要很多其他内容,例如intfloat s。

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

2 个答案:

答案 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是一个缓冲区实例,它在该行的末尾退出范围;当它被写入时,它会锁定,然后写入它的数据。