如何从单个通用对象创建 `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));
}
我有一个 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));
}