【问题标题】:Reading in a std::array from an input stream从输入流中读取 std::array
【发布时间】:2018-11-12 13:59:49
【问题描述】:

我想完成以下操作(代码不会像编写的那样编译,因为>> 没有为std::array 重载):

constexpr array<char, 2> MAGIC_BYTES { 40, 23 };

void VerifyMagicHeader(istream& stream)
{
    //Read in the bytes that should be the magic bytes
    array<char, 2> buffer;
    stream >> buffer //This is the line that won't compile;

    if (buffer != MAGIC_BYTES)
    {/*throw exception here...*/}
}

我知道我可以阅读 char[2] 而不是 std::array&lt;char, 2&gt; 并让它工作,但它不会那么优雅。这似乎是一个对std::array 非常有帮助的运算符,所以我想知道是否有它没有实现的原因,或者我是否需要自己实现它。

【问题讨论】:

    标签: c++ istream stdarray


    【解决方案1】:

    它没有作为标准实现,因为没有单一的方法可以读取/写入数组一些示例:

    1. 作为二进制字符流
    2. 以逗号分隔的列表(如果您的某个字符是逗号怎么办?)
    3. 以空格分隔的列表(如果您的字符之一是空格怎么办?)

    然后,当您在该数组中添加一个模板类时,它会变得更加复杂。数组数组怎么写?

    出于同样的原因,没有一个 STL 容器定义流操作符。

    【讨论】:

    • 我明白你的意思。但是对于std::array&lt;char, 2&gt;,它应该基本上是char[2] 的便利包装器,对吧? char[2] 被重载以供 &gt;&gt; 运算符读取二进制字符流,因此 std::array&lt;char, 2&gt; 具有相同的行为不是很自然。考虑到 char[2]&gt;&gt; 运算符的当前行为,我认为任何其他选项(例如您列出的 2 和 3)将是非常令人惊讶的功能。我这里的推理有问题吗?
    • @ChiuneSugihara 重点是,如果标准定义了运算符,应用程序很难自己定义,将数组读取为字符串可能不是每个人都想要的
    【解决方案2】:

    如果您不需要性能(并且对于 2 个字节您不需要它)并且基于标准算法,我最喜欢这种方法:

    std::copy_n(std::istream_iterator<char>{stream}, 2, begin(MAGIC_BYTES))
    

    现在MAGIC_BYTES 可以是vectorstring 或其他具有随机访问权限的容器!

    【讨论】:

    • 感谢您的回复!当然,我可以考虑将其用于实现。我更好奇为什么运营商首先不存在于std::array 上。我认为它应该有 &gt;&gt; 运算符并且行为与 char[] 相同,但我不确定为什么不是这样。就像这样做是个坏主意,还是只是不存在但可以合理地存在。
    • @ChiuneSugihara 我无法回复您的答案,但恕我直言std::array 不仅仅是一个 C++ 数组,而且具有不同的语义。如果你需要覆盖operator &gt;&gt;,你必须为std::vector做类似
    猜你喜欢
    • 2013-06-03
    • 2013-09-02
    • 2021-04-28
    • 2011-02-12
    相关资源
    最近更新 更多