微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 std::valarray 没有 std::data() 重载?

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

C++17 引入了 std::data(),它适用于 std::vectorstd::array、C 样式数组等。但是为什么没有为 { 引入重载的 std::data() {1}}?

std::valarray 被指定为具有连续存储,可以通过取 std::valarray 的地址进行访问(参见 Notes)。

a[0] 可以简单地定义为返回 std::data(std::valarray& a)。为什么没有做到这一点?是疏忽吗?

我的动机是我正在开发一个通用的序列化库。当它从源(例如 CBOR)接收连续的二进制数数组时,它会检测目标容器是否具有重载的 &(a[0]) 函数data(container) 成员函数以及适当的 {{1} }(匹配原始数字类型)。这三者的存在使得将源数据直接高效地container.resize(n) 放入目标容器成为可能。如果有 value_type 过载,我的生活会更简单。缺少它并不是什么大问题,但确实会使代码更加混乱。


ADDENDUM:我想检测 memcpy() 函数的原因是它告诉我目标容器是连续的。如果它是连续的,那么我可以进行有效的字节复制(通过 std::data(std::valarray&)data 并不重要)。如果它不是连续的,那么我必须一次解压缩每个未对齐的源数组第一个,并根据容器类型使用 std::memcpystd::copy 等将其附加到目标容器。


附录 2:我决定使用适配器和特征方法,而不是检测 push_back 函数的存在。这将使支持非标准或用户定义的容器类型变得更加容易。我的问题是为什么没有 emplace 仍然有效。


附录 3:我应该澄清一下,我需要对只能是数字的 CBOR 类型数组执行此操作。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要字节序交换,如果不小心处理,将字节复制到浮点类型可能会触发奇怪的 NaN 行为。

我现在后悔提到我的动机,应该让 data 问题独立存在。这个问题已经变成了一个火车事故,哈哈。 :-)

解决方法

正如 1201ProgramAlarm 在评论中所述,the proposal to add std::data 没有提及 std::valarray。除非有人能指出为什么不能使用 &(a[0]) 来获取 valarray 的数据指针,否则简单的答案是 valarray 在提案中要么被遗忘,要么被忽略。>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?