У меня есть специальный тип 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;
}