2

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

方法#1:

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

这里,expectedTokenCount是将插入到buffer.

方法#2:

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

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

4

1 回答 1

4

在哪里使用 std::span?

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

[#2] 是有效的 ... 方法吗?

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

哪一个更好?

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

的使用与std::span使用两种尺寸的变化是正交的。你可以做 #1 asvoid(std::span<const int>)并且你可以做 #2 as void(int* const buffer, const std::size_t buffer_size, const std::size_t expectedTokenCount)

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

于 2021-12-18T14:13:11.523 回答