【问题标题】:Using cout with basic_string<unsigned char>将 cout 与 basic_string<unsigned char> 一起使用
【发布时间】:2017-08-23 01:55:14
【问题描述】:

cout 适用于字符串(又名basic_string&lt;char&gt;)和所有数字类型(intcharunsigned chardouble 等)。但是它无法处理basic_string&lt;unsigned char&gt;

#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&lt;unsigned char&gt; 是否有原因?

【问题讨论】:

标签: c++ cout


【解决方案1】:

标准库中没有匹配的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

【讨论】:

    【解决方案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;
    }    
    

    【讨论】:

      【解决方案3】:

      就像std::vector&lt;char&gt; 一样,这里没有明显的“默认”行为,所以它不是开箱即用的。它可以工作;您只需要自己定义如何它的工作原理。

      【讨论】:

        【解决方案4】:

        全局对象std::cout 的类型为std::ostream,它是std::basic_ostream&lt;char&gt; 的别名。相关运算符为std::basic_string::operator&lt;&lt;,它要求std::basic_string&lt;CharT&gt;std::basic_ostream&lt;CharT&gt; 共享同一类型CharT。在您的示例中,您使用的是不支持的 std::basic_string&lt;unsigned char&gt;std::basic_ostream&lt;char&gt;,因为 unsigned charchar 是不同的类型。请注意,signed charunsigned char 始终与 char 不同。

        char - 可以在目标系统上最有效地处理的字符表示类型(具有与有符号字符或无符号字符相同的表示和对齐方式,但始终是不同的类型)。 [...]Link.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-19
          • 2015-01-12
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 1970-01-01
          • 2016-08-19
          • 1970-01-01
          相关资源
          最近更新 更多