加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c stringstream to ostream to string

发布时间:2020-12-16 10:30:18 所属栏目:百科 来源:网络整理
导读:我希望能够做到: foo(stringstream()"number = " 500); 编辑:单线解决方案至关重要,因为这是用于记录目的.这些将围绕代码. 在foo里面会将字符串打印到屏幕或类似的东西. 现在,因为stringstream的运算符返回ostream,foo的签名必须是: foo(ostream o); 但是
我希望能够做到:

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引用,所以没有
进一步的问题在新创建的流上,它是一个无操作.
不过,我认为你会同意它不是最优雅或最直观的
解.

在这种情况下我通常做的是创建一个包装类
包含它自己的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;

其中是用户定义的重载抛出.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读