在哪里使用std::span?
Where to use std::span?
我想编写一个函数,它可以接受任何类型的连续缓冲区(例如 std::array
、std::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
通常是一种改进。
我想编写一个函数,它可以接受任何类型的连续缓冲区(例如 std::array
、std::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)
.
使用 std::span
通常是一种改进。