明确指定要为std :: ostringstream写入的指定字符串

时间:2015-01-30 14:20:53

标签: 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. 我将该缓冲区复制到静态字符串并将其返回
  4. 我认为,如果我可以让流直接写入静态字符串,从而避免复制,我可能会得到一些性能提升。但是我怎么能这样做 - std::ostringstream只能在构造函数中接受const std::string,这将是一个初步填充,而不是要写入的缓冲区。 也许Boost有一些选择,虽然我没有找到...... :(

1 个答案:

答案 0 :(得分:2)

您可以使用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