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

8
C++11引入了std::begin(std::valarray&)std::end(std::valarray&)
C++17引入了std::data(),它可以与std::vectorstd::array、C语言风格的数组等一起使用。但为什么没有为std::valarray引入重载的std::data()呢? std::valarray被指定具有连续的存储空间,可以通过访问a[0]的地址来访问它(请参见注释)。 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_backemplace等将其附加到目标容器上,具体取决于容器类型。 补充说明2:我决定使用适配器和特征方法来代替检测data函数的存在。这将更容易支持非标准或用户定义的容器类型。我的问题关于为什么没有std::data(std::valarray& a)仍然存在。 ADDENDUM 3: 我应该澄清一下,我需要对 CBOR 类型的数组进行这种 hackery,这些数组只能是数字。此外,源缓冲区中的数字未与元素边界对齐。我知道二进制数据可能需要进行大小端交换,并且将字节复制到浮点类型可能会触发奇怪的 NaN 行为,如果不小心处理的话。

我现在后悔提到了我的动机,本来应该让 std::data(std::valarray& a) 的问题独立存在的。这个问题已经变成了一个灾难,哈哈。:-)


6
“两者的存在使得可以高效地将源数据直接复制到目标容器中,使用std::copy()/std::copy_n()为此目的是否有原因,让编译器在可能时进行优化以达到memcpy的效果呢?您不需要访问每个容器的data()就可以使用std::copy/_n,只需使用迭代器即可。” - Remy Lebeau
2
我认为std::valarray并不被视为STL的一部分,因为它不遵循STL的哲学。 - Galik
1
@remy 取一个32位int数据的缓冲区,该缓冲区未对齐为4字节。将这些字节复制到32字节int缓冲区是合法的,但不能将int指针形成到未对齐的缓冲区并std复制它们。另一方面,将未交换错误的端IEEE字节放入浮点数中可能会导致硬陷阱值。 - Yakk - Adam Nevraumont
1
@Galik,根据STL的常见用法存在一些混淆。“STL”和“C++标准库”有什么区别? - Mark Ransom
1
@EmileCormier:“无法从std::vector<uint8_t>的中间复制到std::vector<float>”- 当然可以,例如:std::vector<uint8_t> buffer; /* 填充buffer ... */ std::vector<float> values(n); std::copy_n(reinterpret_cast<char*>(&buffer[index]), n * sizeof(float), reinterpret_cast<char*>(values.data())); - Remy Lebeau
显示剩余25条评论
1个回答

2
正如1201ProgramAlarm在评论中所述,添加std::data的提案没有提到std::valarray。除非有人能指出为什么不能使用&(a[0])来获取valarray的数据指针,否则简单的答案是,在这个提案中可能忘记或忽略了valarray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接