【问题标题】:Creating ostream manipulators for a specific class为特定类创建 ostream 操纵器
【发布时间】:2010-04-22 09:27:48
【问题描述】:

我有一个派生自 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;
   }
}

这仍然不起作用。

【问题讨论】:

    标签: c++ iostream manipulators


    【解决方案1】:

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

    #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;
    }
    

    【讨论】:

    • 我试过了,还是不行。它编译,但不调用操纵器函数。我觉得这很奇怪,因为这正是 std::ostream 中的做法。
    • @petersohn:这一定是你的编译器有问题,因为上面的代码对我来说是这样的(g++ 3.4.4)
    • 我只是想补充一点,我整天都在寻找这个答案,这就像预期的那样工作 (g++ 4.7.0)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2013-05-25
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多