我试图通过将代码#1更改为代码#2来使代码#1更简洁,但它不能按预期工作。任何人都可以告诉我为什么它不起作用?谢谢。
代码#1
double x = 8.9, y = 3.4, z = -4.5;
std::ostringstream q0;
q0 << "(" << x << "," << y << "," << z << ")";
std::string s = q0.str();
代码#2
double x = 8.9, y = 3.4, z = -4.5;
std::string s = static_cast<std::ostringstream &>(
std::ostringstream() << "(" << x << "," << y << "," << z << ")").str();
答案 0 :(得分:7)
我已经复制了你的垃圾。我唯一能想到的是你的静态演员是无效的。这对我来说似乎很奇怪,但这是我能想到的唯一可能发生的事情。可能是op&lt;&lt;返回不能转换为ostringstream的ostringstream以外的东西......就像某种类型的引用流一样。实际上,在为变量分配引用并查看调试器中的类型时,对于ostringstream来说看起来很奇怪。
无论如何,没有理由“简洁”。实际上,对于需要阅读代码的其他开发人员而言,简洁通常非常烦人。如果你想成为“简洁”,那就把你的东西放在一个函数中,该函数返回一个字符串并将其命名为有用的东西。
编辑:
实际上,我想我可能会有更好的答案。您将非const引用绑定到临时并在其上调用函数。保证const引用继续存在直到“语句”结束(现在忘记技术术语但它已经关闭)。非const引用没有此保证。因此,当您在此非const引用上调用str()时,我认为您正在引发未定义的行为,因为编译器可以自由删除它引用的临时值。
答案 1 :(得分:3)
您可能希望使用此answer中提供的代码。
答案 2 :(得分:3)
我刚才问过a similar question。答案解释了为什么你所做的不起作用(你可能遇到过编译时错误或像我一样打印字符串作为十六进制地址),以及如何解决它(Johannes Schaub使用{发布了一个非常好的解决方法{1}})。
答案 3 :(得分:1)
如果您有权访问boost format library,则可以将以下内容视为“简洁”。
cout << boost::format("writing %1%, x=%2% : %3%-th try") % "toto" % 40.23 % 50;
答案 4 :(得分:1)
您已经解决了上面“为什么”已经解决的问题。
一个快速的建议是,你总是可以用ostringstream()
替换ostringstream().flush()
来使你的事情发挥作用。这使得结果符合ref-to-non-const绑定。
答案 5 :(得分:0)
部分ostream
operator<<
重载 - 特别是std::string
和char const*
的重载是免费功能,例如:
ostream& operator<<(ostream& os, T const&);
如果流是临时的(在您的情况下是它),则它无法绑定到ref-to-non-const
,并且无法选择重载。
因此,您偶然会意外地使用非首选过载;在这种情况下,void const*
的重载。这就是你看到指针内容(它不是“垃圾”)的原因。
尝试在一行上进行此序列化时,这是一个限制,您无法绕过它。