【问题标题】:Overloading << to define manipulators重载 << 以定义操纵器
【发布时间】:2010-11-11 12:43:33
【问题描述】:

我在 joelonsoftware.com http://discuss.joelonsoftware.com/default.asp?joel.3.594503.11 的存档文件中发现了这个问题

“嗨,

我今天过得特别慢,而且 无法理解接线员 超载问题。我想要一个 类能够通过 插入运算符,即:

myClassInstance

在内部,我希望一切都结束 在一个字符串流中,这样我就可以了 将其种植到其他溪流(例如 std::cout 和一个 ofstream)。我有 非常困惑我怎么能做到这一点 无需编写运算符

感谢您的帮助!”

这正是我想要做的。通过定义模板和另一个重载方法来处理像在 ostream 类中定义的 endl 这样的操纵器,我找到了处理所有类型的方法。

UIStream&  UIStream ::operator << (const T str)
 {
     CString cstr(stringify(str).c_str());
     theFrame->m_pOutputView->WriteMessage(cstr);
     return *this;
 }

 //for manipulators like std::endl
UIStream&  UIStream ::operator <<(ostream& (*m)(ostream&))
{
     //stream<<*m; 
     //CString cstr((*m)(new ostream).c_str());
    if(*m==&std::endl);
        theFrame->m_pOutputView->WriteMessage("\n");
     return (*this);
}

我仍在与接受 ios_base 中定义的 hex dec 或 oct 等参数的操纵器作斗争。

【问题讨论】:

  • 我真的很喜欢你的问题的答案,即std::endl is of unknown type when overloading operator<<
  • 同一用户已经在两个帖子中处理了这个问题。 Kazoom,请阅读答案!
  • 你确定吗?我认为这个问题与处理带有参数的操纵器有关,据我所知,其他问题并未涵盖这一点。虽然说 hex、dec 和 oct 不是带参数的操纵器...
  • 这个问题之前已经回答过(在我的回答中还有其他人:stackoverflow.com/questions/1133739/…

标签: c++ operator-overloading


【解决方案1】:

可能是阅读有关该主题的好书的想法。我推荐 Langer 和 Kreft 的 Standard C++ IOStreams and Locales

【讨论】:

    【解决方案2】:

    让您的流与带参数的操纵器一起工作并不像没有参数时那么简单。问题是操纵者的形式是

    ImpDefClass manipulator( argument list );
    

    其中ImpDefClass,顾名思义,是一个实现定义的类。例如,在我的系统上,setprecision 被声明为

    inline _Setprecision setprecision(int __n);
    

    其中_Setprecision 只是我的实现自行定义的struct

    因此问题是你不能像这样写一个新的流操作符

    UIStream& operator<<( UIStream&, XXX );
    

    因为XXX 是实现定义的类。除了定义您自己的操纵器来执行相同的任务或将您的代码硬连接到特定的实现之外,我不确定如何解决这个问题。

    【讨论】:

      【解决方案3】:

      我的做法是在 MyClass 中包含一个 std::stringstream,然后重载

      class MyClass {
      public:
         template <class T>
         MyClass & operator <<(const T & rhs) {
             m_stream << rhs;
             return *this;
          }
          private:
              std::ostringstream m_stream;
      };
      

      编辑:我想这不是您要找的。仍然可以用于更简单的用途。

      【讨论】:

      • 我也会这样做。除了我会返回对MyClass 的引用而不是ostringstream
      • 此模板将不匹配必须使用非模板化重载处理的操纵器(std::endl、std::hex...)。
      • @Matt:确实,它会使其更加通用; @dribeas:哦,我今天学到了一些东西。我建议您回答您链接到的问题。
      【解决方案4】:

      您提出的问题越多,我就越相信解决您的问题的正确方法是编写一个新的 streambuf。网上有这方面的文档——在这里解释对我来说有点太长了——还有一个名为 iostreams 的 boost 库可以帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2015-06-02
        • 2010-10-06
        • 2016-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多