c++ - 我应该用 GSL 跨度替换 (void*, size) 吗?

标签 c++ guideline-support-library

假设我有

int foo(void* p, size_t size_in_bytes);

并假设制作 foo 没有意义键入。我想成为一名优秀的编码员并应用 C++ 核心准则。具体来说,我想使用跨度而不是 (*, len) 对。嗯,span<void>不会编译(不能添加到 void * );和 span<char>span<uint8_t>等将暗示 foo 实际上需要字符,但它可能不需要。

所以我应该使用 span<something-with-size-1>在这种情况下,或坚持使用 void*

最佳答案

这个问题没有统一的答案。

对于一个函数来说,它需要一个 span<T>意味着它采用连续的值数组,没有任何形式的所有权转移。如果该描述不能合理地代表正在发生的事情,那么它不应该使用 span<T>。 .

例如:

What if the function checks whether the buffer intersects a region in my memory space which is, say, mapped to a file?

这听起来不像 span<T> .听起来您应该有一个简单的聚合,其名称应清楚地表明其含义:

struct memory_region
{
  void* p;
  size_t size_in_bytes;
};

你甚至可以给它一个成员函数来测试交叉点。如果您正在制作一个系统来处理此类内存区域,我可能会建议使用带有构造函数等的更加封装的类类型。

函数采用什么类型应该解释数据的含义。最好这个含义是一般意义上的,但至少,它应该说明它对所讨论的功能意味着什么。


还有一点:

or span<uint8_t> etc. would imply foo actually expects chars

不,不会。同时 uint8_t几乎肯定会与 unsigned char 具有相同的大小,这并不意味着人们期望能够将一组字符传递给任何需要 span<uint8_t> 的函数。 .如果该函数想要宣传它接受字符,它会使用 unsigned char .


I meant to say span<whatever> would imply the function expect whatever's.

是的,span 的要求s 是传递给它的实际数组 T给定大小的 s。

关于c++ - 我应该用 GSL 跨度替换 (void*, size) 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37471671/

相关文章:

c++ - 如何消除 'Only index into arrays using constant expressions' 警告?

c++ - gsl::span 无法使用 std::regex 进行编译

c++ - gtkmm 树模型添加行

c++ - 如何使用Core linux编译和运行C++

c++ - 在 C++ 中访问 lambda 之外的 lambda 捕获初始化变量

C++ - 使用文件作用域静态函数

c++ - 您是否打算从违反契约(Contract)中恢复过来?

c++ - 从 Qt::Key 到 native 键盘代码

c++ - 我应该在新的 C++ 项目中使用指南支持库 (GSL) 吗?

c++ - 了解此 `const&` 特化的必要性