使用cout输出basic_string<unsigned char>类型的内容

3

cout可以处理字符串(也称为basic_string<char>)和所有数字类型(intcharunsigned chardouble等)。但是它无法处理basic_string<unsigned char>

#include <iostream>
#include <string>
int main()
{
    std::basic_string<unsigned char> zzz(3, 'z');
    std::cout << zzz << std::endl;
    return 0;
}

这段代码无法通过编译:

error: invalid operands to binary expression ('ostream' (aka 'basic_ostream<char>') and 'std::basic_string<unsigned char>')

我希望这个行为与字符串相同。难道 ostream 不支持 std::basic_string<unsigned char> 是有原因的吗?


相关重载:http://en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt - chris
也许你想要的在这里:[https://dev59.com/gnVC5IYBdhLWcg3wfhKL#277684] - marquesm91
4个回答

2

标准定义了以下模板运算符:

template <class CharT, class Traits, class Allocator>
std::basic_ostream<CharT, Traits>& 
    operator<<(std::basic_ostream<CharT, Traits>& os, 
               const std::basic_string<CharT, Traits, Allocator>& str);

这意味着您可以将std :: string 流式传输到std :: cout ,并将std :: wstring 流式传输到std :: wcout 。但是,您不能将std :: wstring 流式传输到std :: cout
您的问题在于std :: cout 使用字符类型char 而不是unsigned char
如果需要,您可以在全局命名空间中定义其他运算符。
typedef std::basic_string<unsigned char> ustring;

std::ostream& operator << (std::ostream& stream, const ustring& str) {
    if (const auto len = str.size())
       stream.write(reinterpret_cast<const char*>(&str[0]), len);
    return stream;
}    

2

标准库中没有与之匹配的std::ostream重载。不过,您可以提供自己的重载。尽管对于不是std::isprint字符,您可能会有不同的行为。

#include <iostream>
#include <string>

std::ostream& operator << (std::ostream& os, const std::basic_string<unsigned char>& str){
    for(auto ch : str)
        os << static_cast<char>(ch);
    return os;
}

int main()
{
    std::basic_string<unsigned char> zzz(3, 'z');
    std::cout << zzz << std::endl;
    return 0;
}

输出:

zzz

Demo


1
全局对象 std::cout 的类型为 std::ostream,它是 std::basic_ostream<char> 的别名。相关的运算符是 std::basic_string::operator<<,它要求 std::basic_string<CharT>std::basic_ostream<CharT> 具有相同的类型 CharT。在您的示例中,您使用了std::basic_string<unsigned char>std::basic_ostream<char>,这是不支持的,因为unsigned charchar是不同的类型。请注意,signed charunsigned char始终与char不同。
char - 字符类型,它可以在目标系统上以最高效的方式处理(具有与signed char或unsigned char相同的表示和对齐方式,但始终是一个不同的类型)。[...] 链接

1

就像使用std::vector<char>一样,这里也没有明显的“默认”行为,因此它不会被自动提供。它是可以工作的;您只需要自己定义它的工作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接