如何在Cout中插入N个字符?

时间:2013-11-21 18:59:11

标签: c++ operator-overloading cout

我正在将自己的StringRef类(由char*组成到内存中,并且size_t长度),我实施operator<<。有没有一种方法(除了创建临时的以null结尾的char数组或std::string之外)在其中插入N个字符到cout对象中?

更新:澄清:

StringRef是一个对象,包含一个指向内存的指针(在我的例子中为缓冲区)和一个长度。缓冲的数据不以空值终止;我可以计算我存储在StringRef对象中的长度。我想重载&gt;&gt;对于这个对象。我知道如何插入cout的唯一类型的“字符串”是以null结尾的char数组和std :: strings。如何将StringRef [其中N是长度]指向的N个字符插入cout?

2 个答案:

答案 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]; }
};