如何在cout中插入N个字符

How to insert N characters into cout?

本文关键字:字符 插入 cout      更新时间:2023-10-16

我正在滚动我自己的StringRef类(包括一个到内存中的char*和一个长度为size_t的类),但我一直在实现operator<<。有没有一种方法(除了创建一个临时的以null结尾的char数组或std::string之外)可以将N个字符插入cout对象?

更新:澄清:

StringRef是一个对象,它由一个指向内存(在我的例子中是指向缓冲区)的指针和一个长度组成。缓冲的数据不是空终止的;我可以计算长度,并将其存储在StringRef对象中。我想为这个对象重载>>。我知道如何插入到cout中的"字符串"只有以null结尾的char数组和std::字符串。如何将StringRef(其中N是长度)指向的N个字符插入cout?

对于这种低级别类型,通常的解决方案是输出直接到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;
}

对于复杂类型,这就不那么方便了,因为没有格式,但对于像您这样的简单类型,它是可能是优选的解决方案。

以下是的操作方法

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