Печать строка для временного объекта потока в C ++

У меня есть специальный тип ostringstream, в который я пытаюсь вывести текст как временный объект, но у меня возникли проблемы . Чтобы прояснить, это, по сути, то, что я хочу сделать:

ostringstream() << "PARTY DOWN!" << endl;

А теперь, прежде чем вы скажете: «Но Зак, этот код совершенно бесполезен! Объект уничтожается в конце строки, как бы вы вообще узнали, если бы это произошло? что-нибудь? ", выслушайте меня. Я не пытаюсь сделать это с помощью простых потоков ostring, а скорее с производным классом, в котором деструктор фактически предоставляет путь для выхода данных из объекта. На самом деле это выглядит примерно так:

specialstringstream() << "PARTY DOWN!" << endl;

Где specialstringstream имеет деструктор, который выгружает текст в другое место.

Я не буду вдаваться в подробности, почему я это делаю. Вам придется поверить мне, что это имеет смысл для того, что мне нужно делать, и прекрасно вписывается в существующую гигантскую кодовую базу.

Вот проблема: когда я это делаю, все компилируется и запускается, но я получаю адрес указателя, напечатанный на моем выходе вместо "PARTY DOWN!" нить. Я определил, что это происходит потому, что компилятор выбирает для вывода потока оператор ostream & operator << (const void * val) , а не ostream & operator << ( ostream & out, const char * s) .

У меня смутное представление о том, почему, но я не знаю, как это обойти.Что я могу сделать, чтобы char * s печатался во временном экземпляре строкового потока?

Вот короткая версия объекта SpecialStringStream, демонстрирующего такое поведение:

class SpecialStringStream : public ostringstream
{
  public:
    SpecialStringStream(ostream* regularStream)
    {
      regularStream_ = regularStream;
    }

    ~SpecialStringStream()
    {
      if (regularStream_ != NULL)
        (*regularStream_) << str(); 
    }

  private:
    ostream* regularStream_;
};

Когда я делаю что-то вроде: SpecialStringStream (someStreamPtr ) << "PARTY DOWN!" << endl; , я получаю адрес указателя типа «00444D60» в моем выводе вместо сообщения.

РЕДАКТИРОВАТЬ: Поскольку я слишком новичок, чтобы отвечать на свой вопрос, вот что я выбрал благодаря всем ответам.

Я придумал следующее решение, которое работает под Visual C ++ 8 и всеми другими компиляторами, в которых мне это нужно. Я создал шаблонный оператор, который в основном лишает константу SpecialStringStream ее констант, преобразует ее как ostream и позволяет операторам ostream делать свое дело. Не стесняйтесь разорвать его в клочья в комментариях и предупредить меня обо всех ужасных потенциальных ошибках, которые я ввел!

template <class T>
std::ostream& operator<<(const SpecialStringStream &o, T msg)
{
    return static_cast<std::ostream&>(const_cast<SpecialStringStream&>(o)) << msg;
}
5
задан Zack Schilling 4 November 2011 в 20:50
поделиться