我在查看这个问题std::ostringstream
时正在弄乱stringbuilder()
,并注意到Nawaz的std::ostringstream
包装并认为,这应该与std::cout << (std::ostringstream("select * from foo limit") << max_limit).str() << std::endl;
一起使用
所以我的第一次尝试如下:
operator<<
现在这显然无法编译(正确),因为std::ostream
的结果是str()
- 它没有成员const
。所以我认为演员应该做的伎俩,特别是对std::cout << static_cast<std::ostringstream const&>(std::ostringstream("select * from foo limit") << max_limit).str() << std::endl;
引用的强制转换(也可以使用强制转换为普通引用),所以第二次尝试:
stringbuilder
现在这个编译很好并且运行,但输出是,而不是我期望的。
10选*来自foo limit
现在 - 这是问题,我在某处调用了一些未定义的行为 - 如果是这样的话?这与Nawaz所采用的方法有何不同(我想除了他的算子的结果是std::ostream
本身而不是max_limit
)。
编辑:这是sprintf in c++?。
编辑:oops - 忘记指定,int
是{{1}}。
答案 0 :(得分:4)
您需要将流的位置移动到ostringstream
使用的内部缓冲区的末尾:
std::ostringstream out("select * from foo limit ", std::ios_base::app);
out << max_limit;
std::cout << out.str () << std::endl;
请参阅ostringstream
构造函数上的documentation。
答案 1 :(得分:2)
什么是maxLimit
?
某些ostream
operator<<
重载是免费功能,例如:
ostream& operator<<(ostream& os, T const&);
如果流是临时的(在您的情况下是它),则它无法绑定到ref-to-non-const
,并且无法选择重载。
因此,您可能偶然使用非首选过载;可能类似于char const*
的重载。很难说不知道maxLimit
是什么。
尝试在一行上进行此序列化时,这是一个限制,您无法绕过它。
您还试图将std::cout
发送到std::cout
,这显然不是您打算做的。
更新 Vijay想通了。
std::cout << static_cast<std::ostringstream const&>(
std::ostringstream("select * from foo limit", std::ios_base::app) << max_limit
).str() << std::endl
但是,上述内容仍然值得铭记。
答案 2 :(得分:0)
您也可以简单地将flush
用作:
static_cast<std::ostringstream const&>(std::ostringstream().flush() << "select * from foo limit " << max_limit).str() << std::endl;
但是代码不一样。它使用默认构造函数。
作为旁注:这里dynamic_cast
更合适吗?