Spec-Zone.ru › C++

std::as_bytes, std::as_writable_bytes

Определено в заголовке <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) (с C++20)
template< class T, std::size_t N >
std::span<std::byte, S/* see below */>
    as_writable_bytes( std::span<T, N> s ) noexcept;
(2) (с C++20)

Получает представление объекта элементов диапазона s.

Если N является std::dynamic_extent, то размер возвращаемого диапазона 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()}.
2) Диапазон, сконструированный с использованием {reinterpret_cast<std::byte*>(s.data()), s.size_bytes()}.

Пример

#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::uppercase << std::setfill('0');
    for (auto const b : bytes)
        std::cout << std::setw(2) << 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});
 
    // Change the sign bit that is the MSB (IEEE 754 Floating-Point Standard).
    writable_bytes[3] |= std::byte{0B1000'0000};
 
    print(data[0], const_bytes);
}

Возможный вывод:

 3.14159 = { D8 0F 49 40 }
-3.14159 = { D8 0F 49 C0 }

См. также

start_lifetime_asstart_lifetime_as_array
(C++23)
неявно создаёт объекты в заданном хранилище, используя повторно представление объекта
(шаблон функции)
byte
(C++17)
тип byte
(перечисление)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/span/as_bytes

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API