在哪里使用std::span?

Where to use std::span?

我想编写一个函数,它可以接受任何类型的连续缓冲区(例如 std::arraystd::vector原始数组 等)调用站点。我想出了两个方法。

方法一:

void func( int* const buffer, const std::size_t expectedTokenCount );

这里,expectedTokenCount是要插入到buffer中的最大元素数。

方法二:

void func( const std::span<int> buffer, const std::size_t expectedTokenCount );

在这种方法中,我认为我最好以一种首先通过 buffer.size( ) 检查 buffer 的大小并将其与 expectedTokenCount 进行比较以确保它的容量大于或等于 expectedTokenCount 否则它会抛出某种异常。这是比第一种方法有效且更安全的方法吗?哪一个更好?如果将向量传递给 span 及其 size 成员函数,其行为是否会发生变化,还是与数组相同?

Where to use std::span?

无论您在何处使用指针和大小,都可以使用 std::span 代替指针和大小。

Is [#2] a valid ... method?

当然可以。但是,您确实更改了指针的常量。你应该使用 std::span<const int>.

Which one is better?

各有各的用途。但在大多数情况下传递两个尺寸是多余的

std::span 的使用与使用两种尺寸的变化是正交的。您可以按照 void(std::span<const int>) 执行 #1,也可以按照 void(int* const buffer, const std::size_t buffer_size, const std::size_t expectedTokenCount).

执行 #2

使用 std::span 通常是一种改进。