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

标签 c++ memcpy c++-standard-library contiguous valarray

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/

相关文章:

c++ - 如何通过 boost::iostream 防止 zip 炸弹

必要时插入类型名的 C++ 宏

char* 上 memset 的 C++ 等价物

C 置换与 memcpy 问题

c++ - 将 uint8_t 的 vector 转换为位集

c++ - 关键字 'template' 混淆了 MSVC

c++ - 为什么我的中位数中位数快速选择算法段错误?

c++ - memcpy 将 float 转换为 int

c++ - optional<T> 进入 C++ 标准的含义

c++ - 为什么标准库不调用容器删除函数(如果存在)?