std::as_bytes, std::as_writable_bytes

< cpp‎ | container‎ | span
template< class T, std::size_t N>
std::span<const std::byte, S/* see below */> as_bytes(std::span<T, N> s) noexcept;
(1)
template< class T, std::size_t N>
std::span<std::byte, S/* see below */> as_writable_bytes(std::span<T, N> s) noexcept;
(2)

获得对 span s 的元素的对象表示的视图。

Nstd::dynamic_extent ,则返回的 span S 的长度亦为 std::dynamic_extent ;否则它是 sizeof(T) * N

as_writable_bytes 仅若 std::is_const_v<T>false 才参与重载决议。

返回值

1){reinterpret_cast<const std::byte*>(s.data()), s.size_bytes()} 构造的 span 。
2){reinterpret_cast<std::byte*>(s.data()), s.size_bytes()} 构造的 span 。

示例

#include <cstddef>
#include <iomanip>
#include <iostream>
#include <span>
 
void print(float const x, std::span<const std::byte> const bytes)
{
    std::cout << std::setprecision(6) << std::setw(8)
              << x << " = { " << std::hex << std::showbase;
    for (auto const b : bytes) {
        std::cout << std::to_integer<int>(b) << ' ';
    }
    std::cout << std::dec << "}\n";
}
 
int main()
{
    /* mutable */ float data[1] { 3.141592f };
 
    auto const const_bytes = std::as_bytes(std::span{ data });
 
    print(data[0], const_bytes);
 
    auto const writable_bytes = std::as_writable_bytes(std::span{ data });
 
    // 更改作为最高有效位的符号位( IEEE 754 浮点标准)
    writable_bytes[3] |= std::byte{ 0b1000'0000 };
 
    print(data[0], const_bytes);
}

可能的输出:

 3.14159 = { 0xd8 0xf 0x49 0x40 }
-3.14159 = { 0xd8 0xf 0x49 0xc0 }