gpt4 book ai didi

c++ - 为什么 std::valarray 没有 std::data() 重载?

转载 作者:行者123 更新时间:2023-12-03 10:03:49 27 4
gpt4 key购买 nike

C++11 介绍 std::begin(std::valarray&) 以及 std::end(std::valarray&) .
C++17 介绍 std::data() std::vector 一起使用, std::array 、C 风格的数组等。但为什么不是重载 std::data()std::valarray 推出?std::valarray指定为连续存储,取地址a[0]即可访问(见 Notes)。std::data(std::valarray& a)可以简单地定义为返回 &(a[0]) .为什么没有做到这一点?是疏忽吗?
我的动机是我正在开发一个通用的序列化库。当它从源(例如 CBOR)接收到连续的二进制数数组时,它会检测目标容器是否有过载 data(container)函数,一个 container.resize(n)成员函数,以及适当的 value_type (匹配原始数字类型)。这三者的存在使得有效地memcpy()成为可能。源数据直接进入目标容器。如果有一个 std::data(std::valarray&) 会让我的生活更简单重载。缺少它并不是一个问题,但它确实使代码更加困惑。

附录 : 之所以要检测data功能是它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过 std::memcpystd::copy 并不重要)。如果它不是连续的,那么我必须一次解压缩每个未对齐的源数组第一个,并使用 push_back 将其附加到目标容器中。 , emplace等,具体取决于容器类型。

附录 2 :我决定使用适配器和特征方法,而不是检测 data 的存在功能。这将使支持非标准或用户定义的容器类型变得更加容易。我关于为什么没有 std::data(std::valarray& a) 的问题仍然站立。

附录 3 :我应该澄清一下,我需要对只能是数字的 CBOR 类型数组执行此操作。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。
我现在后悔提到我的动机,应该让std::data(std::valarray& a)问题自立。这个问题已经变成了一个火车事故,哈哈。 :-)

最佳答案

正如评论中所述的 1201ProgramAlarm,the proposal to add std::data 没有提及 std::valarray .除非有人能指出原因 &(a[0])不能用于获取valarray的数据指针,简单的答案是valarray在提案中被遗忘或忽略。

关于c++ - 为什么 std::valarray 没有 std::data() 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66072510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com