大佬教程收集整理的这篇文章主要介绍了c stringstream to ostream to string,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
foo(Stringstream()<<"number = " << 500);
编辑:单线解决方案至关重要,因为这是用于记录目的.这些将围绕代码.
在foo里面会将字符串打印到屏幕或类似的东西.
现在,因为Stringstream的运算符<<返回ostream&,foo的签名必须是:
foo(ostream& o);
但是如何转换ostream&串? (或char *).
实现此用例的不同方法也是受欢迎的.
foo( std::oStringstream().flush() << "number = " << 500 );
std :: ostream :: flush()返回一个非const引用,所以没有
进一步的问题在新创建的流上,它是一个无操作.
不过,我认为你会同意它不是最优雅或最直观的
解.
在这种情况下我通常做的是创建一个包装类
包含它自己的std :: oStringstream,并提供模板化
成员操作符<<转发到包含的
的std :: oStringstream.你的函数foo将采用const
引用这个 – 或者我做的是有析构函数调用
直接foo,这样客户端代码甚至不必担心
它;它做的事情如下:
log() << "number = " << 500;
函数log()返回包装类的实例(但请参阅
下面),这个类的(最终)析构函数调用你的函数
FOO.
这有一个小问题.可以复制返回值,
复制后立即销毁.哪个会破坏大灾难
我刚刚解释过的;实际上,因为Std :: oStringstream不是
可复制,甚至不会编译.这里的解决方案是把所有的
实际逻辑,包括std :: oStringstream的实例和
析构函数逻辑在一个单独的实现类中调用foo,有
公共包装器有一个boost :: shared_ptr到它,然后转发.要么
只需在类中重新实现一些共享指针逻辑:
class LogWrapper { std::oStringstream* collector; int* useCount; public: LogWrapper() : collector(new std::oStringstream),useCount(new int(1)) { } ~LogWrapper() { -- *useCount; if ( *useCount == 0 ) { foo( collector->str() ); delete collector; delete useCount; } } template<typename T> LogWrapper& operator<<( T const& value ) { (*collector) << value; return *this; } };
请注意,扩展它很容易支持可选的日志记录;只是
为LogWrapper提供一个构造函数,它将collector设置为
NULL,并在运算符<<中对此进行测试. 编辑: 另一件事发生在我身上:你可能想要检查一下
析构函数是由异常调用而不是调用
在那种情况下foo.从逻辑上讲,我希望你唯一的例外
可能得到的是std :: bad_alloc,但总会有一个用户
写道:
log() << a + b;
其中是用户定义的重载抛出.
以上是大佬教程为你收集整理的c stringstream to ostream to string全部内容,希望文章能够帮你解决c stringstream to ostream to string所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。