我有一种特殊类型的 ostringstream,我试图将文本作为临时对象输出,但我遇到了一些麻烦。需要明确的是,这基本上是我想要做的:
ostringstream() << "PARTY DOWN!" << endl;
现在在你说:“但是 Zack,那段代码完全没有价值!对象在行尾被销毁,你怎么知道它是否做了什么?”,听我说完。我不会尝试使用普通的 ostringstreams 来执行此操作,而是使用派生类,其中析构函数实际上为数据提供了退出对象的路径。所以实际上,它看起来更像这样:
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 和我需要的所有其他编译器。我创建了一个模板运算符,它基本上去除了 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;
}