将 std::mdspan 的一行作为 std::span 访问

Plu*_*uin 7 c++ c++23 mdspan

我正在尝试Kokkos 参考 mdspan 实现,看看它是否可以用来简化我们代码库中的一些代码。我直观地认为可能的一件事是选择二维的一行std::mdspan并将其分配给 a std::span,例如有点像

float* data = ...

std::mdspan matrix (data, 2, 5);

std::span vector = matrix[0]; // <-- should be a std::span<float, std::dynamic_extent> viewing row 0 of matrix
Run Code Online (Sandbox Code Playgroud)

经过一番研究,我没有找到一种明显直接的方法来实现这一目标,无论是使用 mdspan 的成员函数还是使用 std 库中的免费函数。目前我看到的唯一可能性是回到原始指针级别并编写自己的自由函数来执行此操作,这并不像我预期的那么优雅。我是否忽略了某些东西,或者这真的不是 mdspan 的功能吗?

康桓瑋*_*康桓瑋 3

您可以通过 C++26将原始 2d- 切片mdspan为 1-d 。mdspanstd::submdspan()

由于结果的底层序列mdspan是连续的,因此可以使用它来构造std::span

float* data = ...;

std::mdspan matrix(data, 2, 5);

std::mdspan row0 = std::submdspan(matrix, 0, std::full_extent);
std::span vector0(row0.data_handle(), row0.size()); // row 0 of matrix

std::mdspan row1 = std::submdspan(matrix, 1, std::full_extent);
std::span vector1(row1.data_handle(), row1.size()); // row 1 of matrix
Run Code Online (Sandbox Code Playgroud)

使用参考mdspan实现进行演示。