Создание ostream манипуляторов для определенного класса - PullRequest
2 голосов
/ 22 апреля 2010

У меня есть класс, производный от 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 Ответ

3 голосов
/ 22 апреля 2010

Вам необходимо добавить поддержку манипуляторов в вашем классе:

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