我正在将自己的StringRef类(由char*
组成到内存中,并且size_t
长度),我实施operator<<
。有没有一种方法(除了创建临时的以null结尾的char数组或std::string
之外)在其中插入N个字符到cout
对象中?
更新:澄清:
StringRef是一个对象,包含一个指向内存的指针(在我的例子中为缓冲区)和一个长度。缓冲的数据不以空值终止;我可以计算我存储在StringRef对象中的长度。我想重载&gt;&gt;对于这个对象。我知道如何插入cout的唯一类型的“字符串”是以null结尾的char数组和std :: strings。如何将StringRef [其中N是长度]指向的N个字符插入cout?
答案 0 :(得分:2)
这种低级别类型的通常解决方案是输出 直接到streambuf:
std::ostream&
operator<<( std::ostream& dest, StringRef const& obj )
{
std::ostream::sentry s( dest );
if ( s ) {
std::streambuf* sb = dest.rdbuf();
if ( sb == nullptr ) {
dest.setstate( std::ios_base::badbit );
} else if ( sb->sputn( obj.characters, obj.count ) != obj.count ) {
dest.setstate( std::ios_base::badbit );
}
}
return dest;
}
对于复杂类型,这不太方便,因为那里 没有格式化,但对于像你这样的简单类型,它是 可能是首选的解决方案。
答案 1 :(得分:0)
这是你如何做的
friend std::ostream& operator << (ostream &oss, StringRef &obj) {
oss << obj.characters;
return oss;
}
要将它与基于for循环的范围一起使用,您的StringRef类应该类似于:
class StringRef {
//... some other variables
char *characters;
int count;
public:
//...Other methods
const char *begin() { return &characters[0]; }
const char *end() { return &characters[count]; }
};