为什么 std::valarray 没有 std::data() 重载?
Why is there no std::data() overload for std::valarray?
C++11 引入 std::begin(std::valarray&)
as well as 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)
可以简单地定义为 return &(a[0])
。为什么没有这样做?是疏忽吗?
我的动机是我正在开发一个通用序列化库。当它从源(例如 CBOR)接收到连续的二进制数数组时,它会检测目标容器是否具有重载的 data(container)
函数、container.resize(n)
成员函数以及适当的 value_type
(匹配原始数字类型)。这三者的存在使得高效地 memcpy()
源数据直接进入目标容器成为可能。如果有 std::data(std::valarray&)
过载,我的生活会更简单。缺少它并不是一个阻碍,但它确实使代码更加混乱。
ADDENDUM:我之所以要检测一个data
函数是因为它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过 std::memcpy
或 std::copy
并不重要)。如果它不连续,那么我必须一次解压缩每个未对齐的源数组编号,并根据容器类型使用 push_back
、emplace
等将其附加到目标容器。
附录 2:我决定使用适配器和特征方法而不是检测 data
函数的存在。这将使支持非标准或用户定义的容器类型变得更加容易。我关于为什么没有 std::data(std::valarray& a)
的问题仍然存在。
附录 3:我应该澄清一下,我需要为 CBOR 类型的数组做这个 hackery,它只能是数字。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。
我现在后悔提到我的动机,应该让 std::data(std::valarray& a)
问题独立存在。这个问题变得多么糟糕,哈哈。 :-)
正如 1201ProgramAlarm 在评论中所述,the proposal to add std::data
没有提及 std::valarray
。除非有人能指出为什么 &(a[0])
不能用于获取 valarray
的数据指针,否则简单的答案是 valarray
在提案中被遗忘或忽略。
C++11 引入 std::begin(std::valarray&)
as well as 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)
可以简单地定义为 return &(a[0])
。为什么没有这样做?是疏忽吗?
我的动机是我正在开发一个通用序列化库。当它从源(例如 CBOR)接收到连续的二进制数数组时,它会检测目标容器是否具有重载的 data(container)
函数、container.resize(n)
成员函数以及适当的 value_type
(匹配原始数字类型)。这三者的存在使得高效地 memcpy()
源数据直接进入目标容器成为可能。如果有 std::data(std::valarray&)
过载,我的生活会更简单。缺少它并不是一个阻碍,但它确实使代码更加混乱。
ADDENDUM:我之所以要检测一个data
函数是因为它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过 std::memcpy
或 std::copy
并不重要)。如果它不连续,那么我必须一次解压缩每个未对齐的源数组编号,并根据容器类型使用 push_back
、emplace
等将其附加到目标容器。
附录 2:我决定使用适配器和特征方法而不是检测 data
函数的存在。这将使支持非标准或用户定义的容器类型变得更加容易。我关于为什么没有 std::data(std::valarray& a)
的问题仍然存在。
附录 3:我应该澄清一下,我需要为 CBOR 类型的数组做这个 hackery,它只能是数字。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。
我现在后悔提到我的动机,应该让 std::data(std::valarray& a)
问题独立存在。这个问题变得多么糟糕,哈哈。 :-)
正如 1201ProgramAlarm 在评论中所述,the proposal to add std::data
没有提及 std::valarray
。除非有人能指出为什么 &(a[0])
不能用于获取 valarray
的数据指针,否则简单的答案是 valarray
在提案中被遗忘或忽略。