我最近正在处理我的自定义缓冲区和流,并且因为我无法从指向iostream的指针调用我的流的行为而陷入困境。
template <int N>
std::iostream& myStream::operator<<(char (&rhs) [N])
{
write(rhs, N);
return *this;
}
myStream* pS = new myStream();
std::iostream& s = *pS;
char buf[5] = "ABCD";
s << buf;
我已经在课堂上覆盖了operator<<
,但是,正如我想象的那样iostream
operator<<
应该是virtual
才能实现这一目标工作,对吗?有没有办法解决这个问题?
EDIT2:
测试std::ostream::operator<<
的代码,ibuf是一个可变向量,溢出方法,如上所列。
int ByteBuffer::overflow(int c) {
std::vector<char>* buf = ibuf__;
buf->resize(buf->capacity() * 2.5);
std::ptrdiff_t putDiff = pptr() - pbase();
setp(buf->data(), buf->data() + putDiff, buf->data() + buf->capacity());
if (c != EOF)
return sputc(c);
return -1;
}
mutable std::vector<char>* ibuf__;
int main(int argc, char** argv) {
ByteBuffer bb;
iostream s(&bb);
char buf[4] = { 'A', 'B', 'C', 'D' };
s << buf;
s << buf << (char)0;
return 0;
}
结果我可以看到ibuf在缓冲区内有"ABCD!@#$ABCD!@#$"
,其中!@#$
代表随机字符序列(但在ABCD
之后&#39; s&#39} 39; s相同的序列)。这就是我假设的原因,它寻求'\0'
。