相关疑难解决方法(0)

std :: ostringstream打印c-string的地址而不是其内容

我偶然发现了一个我最初无法解释的奇怪行为(见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)

c++ stream

19
推荐指数
2
解决办法
6599
查看次数

在C ++中将字符串打印到临时流对象

我有一种特殊的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 …

c++ const reference temporary object

5
推荐指数
1
解决办法
1288
查看次数

标签 统计

c++ ×2

const ×1

object ×1

reference ×1

stream ×1

temporary ×1