我有,需要一个请求方法的网络客户端std::streambuf*
。 此方法实现boost::iostreams::copy
它-ing到自定义std::streambuf
派生类,它知道如何将数据写入到网络的API,它的伟大工程。 这意味着我可以串流文件到该请求,而不需要读它所有到内存中。
有一些情况下,然而,在大数据块都必须送到这不是一个文件,所以我包括一个重载需要一个字符串。 为了避免重复所有的网络码流中,这似乎是显而易见的,我应该成立一个streambuf
表示字符串,并调用其他方法。 我能想出使这项工作的唯一办法是这样的:
std::istringstream ss(data);
send(ss.rdbuf());
不幸的是, istringstream
使得数据,在某些情况下是几兆字节的副本。 它的意义在一般情况下,当然,如果你的手const引用一些对象,你不希望对象假设它可以继续使用该引用。
我工作围绕这与以下几点:
struct zerocopy_istringbuf
: public std::stringbuf
{
zerocopy_istringbuf(std::string const* s)
: std::stringbuf(std::ios::in)
{
char* p = const_cast<char*>(s->c_str());
setg(p, p, p + s->length());
}
};
...
send(&zerocopy_istringbuf(data));
这似乎工作得很好,但我不知道是否真的有必要。 为什么不std::istringstream
具有过载采取std::string const *
? 有一个更好的方法吗?