代码之家  ›  专栏  ›  技术社区  ›  petersohn

为特定类创建Ostream操纵器

  •  2
  • petersohn  · 技术社区  · 14 年前

    我有一个派生自Ostream的类:

    class my_ostream: public std::ostream
    {
        // ...
    }
    

    我想做一个操纵器(例如 do_something ,它特别适用于此类,如下所示:

    my_ostream s;
    s << "some text" << do_something << "some more text";
    

    我做了以下工作:

    std::ostream &do_something(std::ostream &os)
    {
        my_ostream *s = dynamic_cast<my_ostream*>(&os);
        if (s != NULL)
        {
            // do something
        }
        return os;
    }
    

    这是可行的,但相当难看。我尝试了以下方法:

    my_ostream &do_something(my_ostream &s)
    {
        // do something
        return s;
    }
    

    这不管用。我还尝试了另一种方法:

    class my_ostream: public std::ostream
    {
       // ...
       my_ostream &operator<<(const do_something & x)
       {
           // do something
           return *this;
       }
    }
    

    这仍然不起作用。

    1 回复  |  直到 14 年前
        1
  •  3
  •   catwalk    14 年前

    您需要在类中添加对操纵器的支持:

    #include<iostream>
    class my_ostream : public std::ostream
    {
        public:
        std::string prefix;
    
        my_ostream():prefix("*"){}
    
        // manipulator support here:
        my_ostream& operator<<( my_ostream&(*f)(my_ostream&)){
            f(*this);
            return *this;
        }
    };
    
    my_ostream& operator<<(my_ostream &st, const std::string &s){
          std::cout << st.prefix << s;
          return st;
    }
    
    // manipulator: clear prefix
    my_ostream& noprefix(my_ostream &st){
       st.prefix="";
    }
    
    int main(){
      my_ostream s;
      std::string str1("text");
      std::string str2("text");
      s << str1 << noprefix << str2;
    }