我偶然发现了一个我最初无法解释的奇怪行为(见ideone):
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::cout << "Reference : "
<< (void const*)"some data"
<< "\n";
std::ostringstream s;
s << "some data";
std::cout << "Regular Syntax: " << s.str() << "\n";
std::ostringstream s2;
std::cout << "Semi inline : "
<< static_cast<std::ostringstream&>(s2 << "some data").str()
<< "\n";
std::cout << "Inline : "
<< dynamic_cast<std::ostringstream&>(
std::ostringstream() << "some data"
).str()
<< "\n";
}
Run Code Online (Sandbox Code Playgroud)
给出输出:
Reference : 0x804a03d
Regular Syntax: some data
Semi inline : some …Run Code Online (Sandbox Code Playgroud) 我有一种特殊的ostringstream,试图将文本输出为临时对象,但遇到了一些麻烦。要明确的是,这本质上是我想要做的:
ostringstream() << "PARTY DOWN!" << endl;
Run Code Online (Sandbox Code Playgroud)
现在,您要说:“但是Zack,该代码完全不值钱!该对象在行尾被销毁,您什至不知道它是否做了什么?”,听听我的声音。我不尝试使用普通的ostringstreams来执行此操作,而是尝试使用派生类,在该派生类中,析构函数实际上为数据提供了退出对象的路径。所以实际上,它看起来更像是这样:
specialstringstream() << "PARTY DOWN!" << endl;
Run Code Online (Sandbox Code Playgroud)
其中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_;
};
Run Code Online (Sandbox Code Playgroud)
当我执行以下操作时:SpecialStringStream(someStreamPtr) << "PARTY DOWN!" << endl;,我在输出而不是消息中得到了一个类似于“ 00444D60”的指针地址。
编辑:由于我不是一个新用户,无法回答我自己的问题,因此感谢所有答复,这里就是我所决定的。
我想出了以下解决方案,该解决方案可在Visual C ++ 8和我需要的所有其他编译器下使用。我创建了一个模板运算符,该运算符基本上会删除其const常量的const …