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

Bas*_*sti 9 c++ c++20

我有一个类型参数const T&,想将其转换为或任何吐出的std::span<const std::byte>魔法类型。std::as_bytes()

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

编辑:举个例子,什么不能编译:

const std::span<const std::byte> my_span(std::ranges::single_view{ object });
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 13

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

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

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

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

辅助函数可能比较合适:

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));
}
Run Code Online (Sandbox Code Playgroud)