如何从单个通用对象创建 `span<std::byte>`?

How to create a `span<std::byte>` from a single generic object?

我有一个 const T& 类型的参数,想把它变成 std::span<const std::byte>std::as_bytes() 吐出的任何魔法类型。

Ranges有很多构造函数,主要针对容器、数组等。但我似乎无法将单个对象变成这样的span。我觉得这不是一件不合理的事情。

编辑:举个例子,编译:

const std::span<const std::byte> my_span(std::ranges::single_view{ object });

您可以 reinterpret_cast<std::byte *> 一个指向任何对象的指针,它为您提供跨度的第一个参数,您的类型的大小为您提供第二个。

template <typename T>
std::span<const std::byte, sizeof(T)> bytes_view(T & t) {
    return std::span<const std::byte, sizeof(T)> { reinterpret_cast<const std::byte *>(std::addressof(t)), sizeof(T) };
}

template <typename T>
requires (!std::is_const_v<T>)
std::span<std::byte, sizeof(T)> mutable_bytes_view(T & t) {
    return std::span<std::byte, sizeof(T)> { reinterpret_cast<std::byte *>(std::addressof(t)), sizeof(T) };
}

指向单个对象的指针可以与指向单个对象数组的指针一样处理。您可以像这样创建一个跨度:

const T& t = value();
auto s = std::span<const T, 1>{std::addressof(t), 1};

然后您可以使用 std::as_bytes:

auto bytes = std::as_bytes(std::span<const T, 1>{std::addressof(t), 1});

辅助函数可能是合适的:

template<class T>
std::span<T, 1>
singular_span(T& t)
{
    return std::span<T, 1>{std::addressof(t), 1};
}

template<class T>
auto
singular_bytes(T& t)
{
    return std::as_bytes(singular_span(t));
}