首页 > 解决方案 > 如何编写 C++ 库以使用 span 的任何实现?

问题描述

我正在编写一个 I/O 库,用户需要在其中提供要读取或写入的内存块。让我的图书馆接受 aspan<T>似乎是最自然的选择,因为:

不幸的是,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);

标签: c++std-span

解决方案


您可能有一个配置步骤供用户构建您的库(或仅用于头库的 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>在您的代码中使用。


推荐阅读