我想写一个函数,它可以从调用站点接受任何类型的连续缓冲区(例如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.size( )
检查buffer
的大小,并将其与expectedTokenCount
进行比较,以确保其容量大于或等于expectedTokenCount
,否则会引发某种异常。这是一种比第一种方法更有效、更安全的方法吗?哪一个更好?如果将向量传递给span
及其size
成员函数,它的行为会发生变化吗?还是与数组的行为相同?
在哪里使用std::span?
如果您本来会使用指针和大小,那么您可以使用std::span
而不是指针和大小。
〔#2〕是有效的。。。方法
当然。但是,您确实更改了指针的常量。您应该使用std::span<const int>
。
哪一个更好?
每个都有自己的用途。但在大多数情况下,通过两种尺寸是多余的
CCD_ 13的使用与使用两种尺寸的改变正交。您可以将#1作为void(std::span<const int>)
执行,也可以将#2作为void(int* const buffer, const std::size_t buffer_size, const std::size_t expectedTokenCount)
执行。
使用std::span
通常是一种改进。