c++ - 显式指定要写入 std::ostringstream 的指定字符串

标签 c++ stl stream

我有一个代码,它使用 std::ostringstream 将数字写入 std::string:

        template<class T>
        class Converter
        {
        private:
            static std::string s_buffer;     
        public:
            static const char* Out(const T& val)
            {
                std::ostringstream os;
                os << val;
                s_buffer = os.str();
                return(s_buffer.data());
            }
        };

Converter::Out 被多次调用。以至于它甚至出现在分析器中。本质上,这里发生的是:

  1. 创建了 ostringstream 的实例
  2. 它创建一个要写入的缓冲区并写入它
  3. 我将该缓冲区复制到静态字符串并将其返回

我认为,如果我能让流直接写入静态字符串,从而避免复制,我可能会获得一些性能提升。但我该怎么做 - std::ostringstream 只能在构造函数中接受 const std::string ,这将是初步填充,而不是要写入的缓冲区。 也许 Boost 有一些替代方案,尽管我没有找到......:(

最佳答案

您可以访问 ostringstream 的缓冲区使用rdbuf()方法;不幸的是,对底层字符缓冲区的访问受到保护。但是,您可以通过继承轻松解决这个问题:

template<class T>
class Converter
{
private:
    static struct Buf : public std::ostringstream, public std::basic_stringbuf<char>
    {
        Buf() { static_cast<std::basic_ios<char>&>(*this).rdbuf(this); }
        void clear() { setp(pbase(), pbase()); }
        char const* c_str() { *pptr() = '\0'; return pbase(); }
    } s_buf;
public:
    static const char* Out(const T& val)
    {
        s_buf.clear();
        s_buf << val;
        return s_buf.c_str();
    }
};

如果可以选择 Boost,您可以使用 boost::iostreams::filtering_ostreamstring 支持或vector<char> : http://lists.boost.org/boost-users/2012/09/75887.php

关于c++ - 显式指定要写入 std::ostringstream 的指定字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28237872/

相关文章:

c++ - 不合格的名称查找 : Why local declaration hides declaration from using directive

c++ - 将两个 vector 对转换为相应元素的映射

c++ - operator << 中的执行顺序

c# - 分块读取二进制文件

c++ - 在 typedef 结构体上使用 sizeof 运算符

c++ - Igraph 特征向量中心性运行时错误 c++

c++ - 如何在 C++ 中对德语大写字母 Ä、Ö、Ü、ẞ 正确应用 tolower()

java - JMF 输出流

c++ - 这两个来源之间是否存在关于 `auto_ptr` 模板类的矛盾?

c++ - 求STL-aware c++filt