![](/img/trans.png)
[英]Why the capturing lambda cannot be applied to the std::valarray?
[英]Why is there no std::data() overload for std::valarray?
C++11 引入了std::begin(std::valarray&)
以及std::end(std::valarray&)
。
C++17 引入了std::data()
,它與std::vector
, std::array
,C風格 arrays 等一起使用。但是為什么沒有為std::valarray
引入重載的std::data()
?
std::valarray
被指定為具有連續存儲,可以通過獲取a[0]
的地址來訪問(請參閱 注釋)。
std::data(std::valarray& a)
可以簡單地定義為返回&(a[0])
。 為什么沒有做到這一點? 是疏忽嗎?
我的動機是我正在開發一個通用的序列化庫。 When it receives contiguous binary number arrays from a source (such as CBOR), it detects if the destination container has an overloaded data(container)
function, a container.resize(n)
member function, as well as an appropriate value_type
(matching primitive數字類型)。 這三者的存在使得將源數據直接高效地memcpy()
到目標容器中成為可能。 如果有std::data(std::valarray&)
重載,我的生活會更簡單。 缺少它並不是一個阻礙,但它確實使代碼更加混亂。
附錄:我想檢測data
function 的原因是它告訴我目標容器是連續的。 如果它是連續的,那么我可以進行有效的字節復制(通過std::memcpy
或std::copy
並不重要)。 如果它不是連續的,那么我必須根據容器類型使用push_back
、 emplace
等一次將每個未對齊的源數組第一個解包並將 append 解壓縮到目標容器。
附錄 2 :我決定使用適配器和特征方法,而不是檢測data
function 的存在。 這將使支持非標准或用戶定義的容器類型變得更加容易。 我關於為什么沒有std::data(std::valarray& a)
問題仍然存在。
附錄 3 :我應該澄清一下,我需要為 CBOR 類型的 arrays 做這個駭客,它只能是數字。 此外,源緩沖區中的數字未與元素邊界對齊。 我知道二進制數據可能需要字節序交換,如果不小心處理,將字節復制到浮點類型可能會觸發奇怪的 NaN 行為。
我現在后悔提到我的動機,應該讓std::data(std::valarray& a)
問題獨立存在。 這個問題已經變成了什么樣的火車殘骸,哈哈。 :-)
正如評論中所述的 1201ProgramAlarm , 添加std::data
的提議沒有提及std::valarray
。 除非有人能指出為什么&(a[0])
不能用於獲取valarray
的數據指針,否則簡單的答案是valarray
在提案中被遺忘或忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.