c stringstream to ostream to string
我希望能够做到:
foo(stringstream()<<"number = " << 500); 编辑:单线解决方案至关重要,因为这是用于记录目的.这些将围绕代码. 在foo里面会将字符串打印到屏幕或类似的东西. 现在,因为stringstream的运算符<<返回ostream&,foo的签名必须是: foo(ostream& o); 但是如何转换ostream&串? (或char *). 解决方法
显而易见的解决方案是在foo中使用dynamic_cast.但是给定的
代码仍然无法正常工作. (你的例子将编译,但它不会做什么 你认为它应该.)表达式std :: ostringstream()是一个 临时的,你不能用临时的初始化非const引用, 和std :: operator<<(std :: ostream&,char const *)的第一个参数 是一个非const引用. (你可以调用一个成员函数 临时.像std :: ostream :: operator<<(void const *).所以代码 将编译,但它不会做你期望的. 您可以使用以下方法解决此问题: foo( std::ostringstream().flush() << "number = " << 500 ); std :: ostream :: flush()返回一个非const引用,所以没有 在这种情况下我通常做的是创建一个包装类 log() << "number = " << 500; 函数log()返回包装类的实例(但请参阅 这有一个小问题.可以复制返回值, 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; } }; 请注意,扩展它很容易支持可选的日志记录;只是 log() << a + b; 其中是用户定义的重载抛出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |