明确指定要写入的指定字符串 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 实例
- 它创建一个缓冲区来写入并写入它
- 我将该缓冲区复制到静态字符串并return它
我想,如果我能让流直接写入静态字符串,从而避免复制,我可能会得到一些性能改进。但是我该怎么做 - 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() = '[=10=]'; 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
我有一个代码,它使用 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 实例
- 它创建一个缓冲区来写入并写入它
- 我将该缓冲区复制到静态字符串并return它
我想,如果我能让流直接写入静态字符串,从而避免复制,我可能会得到一些性能改进。但是我该怎么做 - 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() = '[=10=]'; 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