8

引入了 C++11std::begin(std::valarray&)以及std::end(std::valarray&).

C++17 引入了std::data()它与std::vector, std::array, C 样式数组等一起使用。但是为什么没有为std::data()引入重载std::valarray呢?

std::valarray被指定为具有连续存储,可以通过获取地址来访问a[0](参见注释)。

std::data(std::valarray& a)可以简单地定义为 return &(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 类型的数组做这个hackery,它只能是数字。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。

我现在后悔提到我的动机,应该让这个std::data(std::valarray& a)问题独立存在。这个问题已经变成了什么样的火车残骸,哈哈。:-)

4

1 回答 1

1

正如 1201ProgramAlarm 在评论中所说,添加的提案std::data没有提及std::valarray. 除非有人能指出为什么&(a[0])不能用于获取valarray's 数据指针,否则简单的答案是valarray在提案中​​被遗忘或忽略。

于 2021-02-06T18:56:25.057 回答