У меня есть специальный тип ostringstream, в который я пытаюсь вывести текст как временный объект, но у меня возникли некоторые проблемы. Чтобы было ясно, это по сути то, что я хочу сделать:
ostringstream() << "PARTY DOWN!" << endl;
Теперь, прежде чем вы скажете: «Но Зак, этот код абсолютно бесполезен! Объект уничтожен в конце строки, как бы вы узнали, что он что-то сделал?», Выслушайте меня. Я не пытаюсь сделать это с простыми потоками ostringstream, а скорее с производным классом, в котором деструктор фактически предоставляет путь для выхода данных из объекта. Так что на самом деле это выглядит примерно так:
specialstringstream() << "PARTY DOWN!" << endl;
Если в specialstringstream есть деструктор, который выводит текст в другом месте.
Я не буду вдаваться в подробности того, почему я это делаю. Вы должны поверить мне, что это имеет смысл для того, что мне нужно сделать, и это прекрасно вписывается в существующую гигантскую кодовую базу.
Вот проблема: когда я делаю это, все компилируется и запускается, но вместо вывода «PARTY DOWN!» На вывод выводится адрес указателя. строка. Я определил, что это происходит, потому что оператор, выбранный компилятором для выполнения вывода потока,
ostream& operator<< (const void* val)
, а не ostream& operator<< (ostream& out, const 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 и со всеми остальными компиляторами, которые мне были нужны. Я создал шаблонный оператор, который в основном лишает const SpecialStringStream своей константности, преобразует его в ostream и позволяет операторам ostream делать свое дело. Не стесняйтесь рвать это в клочья в комментариях и предупреждать меня обо всех ужасных потенциальных ошибках, которые я внес!
template <class T>
std::ostream& operator<<(const SpecialStringStream &o, T msg)
{
return static_cast<std::ostream&>(const_cast<SpecialStringStream&>(o)) << msg;
}