显式指定要写入的字符串 std::ostringstream
Explicitly specify specify string to write to for std::ostringstream
我有一个代码,它使用 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
被称为很多。如此之多,以至于它甚至显示在探查器中。从本质上讲,这里发生的事情是:
- 创建 ostringstream 的实例
- 它创建一个要写入和写入的缓冲区
- 我将该缓冲区复制到静态字符串并将其返回
我认为,如果我可以让流直接写入静态字符串,从而避免复制,我可能会得到一些性能改进。但是我该怎么做 - 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 是一个选项,您可以使用由 string
或 vector<char>
支持的boost::iostreams::filtering_ostream
:http://lists.boost.org/boost-users/2012/09/75887.php
相关文章:
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 使用std::mt19937从字符串中返回一个随机单词
- 我可以重新分配/覆盖std::字符串吗
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 如何将这个std::字符串转换为std::基本字符串
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- std::字符串与 PCWSTR 的对话
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用 std::string_view 的子字符串控制台输出
- std::regex:匹配由数字和空格组成的字符串,并提取数字.如何?
- 重载 std::字符串运算符+ 用于打印枚举名称
- 从std::字符串创建OssBitString
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- C 中的特殊字符的子字符串(STD :: substr)
- 是否建议将字符串std::移动到将被覆盖的容器中
- 显式指定要写入的字符串 std::ostringstream
- 如何将uint16_t转换为宽字符串(std::wstring)
- 读取和Huffman压缩4字节二进制字符串STD C++Linux环境