【问题标题】:Overloading the ostream operator for a class wrapping stringstream为包装字符串流的类重载 ostream 运算符
【发布时间】:2019-09-27 18:03:44
【问题描述】:

我目前正在编写一个类来包装字符串流。我的总体目标是为我的字符串流提供一个线程安全的

您将在下面找到我尝试过的内容。我知道这不是正确的语法,但这正是我所追求的。我当然不能重载

class WrappedStringStream

{

public :

   WrappedStringStream() ;

   template<typename T>
   void AddValue( const T & value )
   {

      m_mutex.Lock() ;

      //here I'd like to do something like m_stringstream << value, but of course since
      //I'm overloading operator<< that won't work

      m_mutex.Unlock() ;
   }

   friend std::ostream & operator<<( std::ostream & out, const WrappedStringStream & string )

   {

      string.AddValue( out ) ;
      return out ;   
   }

protected :

   std::stringstream m_stringstream ;

   mutable Mutex m_mutex ; 
}

如上所述,它无法编译,我理解这是因为我将 WrappedStringStream 作为 const 参数传递并调用不是 const 的 AddValue - 导致丢弃限定符错误。

【问题讨论】:

  • 当你做string.AddValue(out)时,这到底应该做什么?
  • @0x499602D2 AddValue 函数在上面定义了我希望它执行的 cmets。
  • 是的,但是当valuestd::ostreamm_stringstream &lt;&lt; value 没有意义,这是您传递给AddValue 的内容。
  • 您对流操作符的实现似乎与我的期望不符。为什么将一个元素流式传输到流中会更新这样的元素?
  • @0x499602D2,我意识到它没有任何意义,但它是我想要做的指导,请不要将语法视为绝对。我想重载我的类 operator

标签: c++ stringstream ostream istream


【解决方案1】:

解决办法

#include <iostream>
#include <sstream>
#include <mutex>

using namespace std;

class MutexWrapper
{
    private:
        mutex& m_mutex;
    public:
        MutexWrapper(mutex& mtx) : m_mutex(mtx) { mtx.lock () ; };
    ~MutexWrapper() { m_mutex.unlock () ; };
};

class WrappedStringStream
{
    public :
   WrappedStringStream() { };

    template<typename T>
    std::ostream & operator<<(const T& value)
   {
      MutexWrapper wrapper(m_mutex);
      return m_stringstream << value;
   }

void showStream()
{
    cout << m_stringstream.str();
}

protected :
   stringstream m_stringstream;
mutable mutex m_mutex ; 
};

int main()
{
    WrappedStringStream ws;

    ws << "This is a string, " << 5 << 6.78;
    ws.showStream();

    return 0;
}

输出

This is a string, 56.78

========编辑==========
最初我并没有安静地理解提问者的最终目标是什么,而只是专注于如何解决他的语法问题。在多线程环境中使用 尽管如此,还是有一个使用 还要感谢@RemyLebeau,它应该返回 *this 而不是 m_stringstream。

请看下面的代码。

#include <iostream>
#include <sstream>
#include <mutex>

using namespace std;

class WrappedStringStream
{
    public:
        enum StreamSignals
        {
            LoggingStart,
            LoggingEnd
        };

    WrappedStringStream() { };

    std::ostream & operator<<(const StreamSignals& signal)
    {
        if (signal == LoggingStart)
             m_mutex.lock();
        else if (signal == LoggingEnd)
             m_mutex.unlock();

        return *this;
    }

    template<typename T>
    std::ostream & operator<<(const T& value)
    {
        m_stringstream << value;
        return *this;
    }

    void showStream()
    {
        cout << m_stringstream.str();
    }

protected :
   stringstream m_stringstream;
   mutable mutex m_mutex ; 
};

int main()
{
    WrappedStringStream ws;

    ws << WrappedStringStream::StreamSignals::LoggingStart; 
    ws << "This is a string, " << 5 << 6.78;
    ws << WrappedStringStream::StreamSignals::LoggingEnd;
    ws.showStream();

    return 0;
}

【讨论】:

  • 非常感谢!我知道我接近语法,但我不确定。我很感激帮助。我有一个与您的 MutexWrapper 类似的类,它使受互斥保护的返回更容易。再次感谢您!
  • std::lock_guard 是您的 MutexWrapper 类的标准版本。如果一次将多个值插入流中,这也不会保持线程安全。
  • 你的意思是当1个线程调用ws
  • 一次插入多个元素时如何保护?
  • 如果你使用“
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多