c++ - 如何编写 C++ 库以使用 span 的任何实现?
问题描述
我正在编写一个 I/O 库,用户需要在其中提供要读取或写入的内存块。让我的图书馆接受 aspan<T>
似乎是最自然的选择,因为:
- 它不会将容器选择强加给用户。他们可以使用原始指针,
std::vector
或任何其他具有连续存储的容器。 - 它允许我确保内存访问是安全的,因为我知道缓冲区的大小。
不幸的是,span<T>
在 Boost、GSL 和标准库(从 C++20 开始)中存在相互竞争的实现。这些实现的接口是兼容的,从用户的角度来看,他们使用哪一个并不重要。
如何编码我的 I/O 函数,以便它们与 ? 的任何各种实现一起工作span
?
目前我能想到的唯一方法是包含我自己的实现,span
它可以从任何带有::element_type
,.data()
和.size()
.
重要的是仍然支持来自容器的隐式转换,以便用户可以简单地传递一个std::vector
. 例如:
void read_data(span<float> data);
std::vector<float> foo(1024);
read_data(foo);
解决方案
您可能有一个配置步骤供用户构建您的库(或仅用于头库的 config.h):
就像是:
配置.h:
// include guard omitted.
#if defined(SPAN_TYPE) // To allow custom span
template <typename T> using lib_span = SPAN_TYPE<T>;
#elif defined(USE_STD_SPAN)
template <typename T> using lib_span = ::std::span<T>;
#elif defined(USE_BOOST_SPAN)
template <typename T> using lib_span = ::boost::span<T>;
// ...
#else
# error "No span provided"
#endif
然后lib_span<T>
在您的代码中使用。
推荐阅读
- c# - 多个脚本上的委托、事件、操作
- javascript - 联盟 api 请求已被 CORS 策略阻止
- opencv - MFC CDC 创建的 PDC 变量无法读取内存
- vue.js - Vue(Vuetify)中的 V-img 未在浏览器上下文菜单中实现为图像
- bootstrap-4 - Bootstrap h-100 应用于或标记?
- laravel-livewire - 调用 livewire 操作时,CPanel 站点发生错误
- javascript - DataTables 中的复选框需要捕获所有选中的值
- javascript - 将具有不同键的对象数组格式化为表数据
- npm - 如何正确搭建一个新的 Docusaurus 网站?
- python - 日期过滤器在 Django 中失败