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

Explicitly specify specify string to write to for std::ostringstream

本文关键字:字符串 std ostringstream      更新时间:2023-10-16

我有一个代码,它使用 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有一些选择,虽然我没有找到... :(

您可以使用 rdbuf() 方法访问ostringstream的缓冲区;遗憾的是,对基础字符缓冲区的访问是受保护的。但是,您可以通过继承轻松解决此问题:

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() = ''; return pbase(); }
    } s_buf;
public:
    static const char* Out(const T& val)
    {
        s_buf.clear();
        s_buf << val;
        return s_buf.c_str();
    }
};

如果 Boost 是一个选项,您可以使用由 stringvector<char> 支持的boost::iostreams::filtering_ostream:http://lists.boost.org/boost-users/2012/09/75887.php