c++ - 强制 gsl::as_span 返回一个 gsl::span<const T>?

标签 c++ templates guideline-support-library

给定以下函数,采用:只读 float 跨度(动态或任何静态大小):

template <long N> void foobar(gsl::span<const float, N> x);

假设我有一个 vector<float> .将其作为参数传递是行不通的,但使用 gsl::as_span 也行不通:

std::vector<float> v = {1, 2, 3};
foobar(gsl::as_span(v));

以上不编译。显然 gsl::as_span()返回 gsl::span<float> .除了不理解为什么隐式转换为 gsl::span<const float>不可能,有没有办法强制gsl::as_span()返回只读跨度?

最佳答案

在您链接到的 github 页面上查看 GSL/span.h,我发现以下重载 as_span我相信是这里被调用的那个:

template <typename Cont>
constexpr auto as_span(Cont& arr) -> std::enable_if_t<
    !details::is_span<std::decay_t<Cont>>::value,
    span<std::remove_reference_t<decltype(arr.size(), *arr.data())>, dynamic_range>>
{
    Expects(arr.size() < PTRDIFF_MAX);
    return {arr.data(), narrow_cast<std::ptrdiff_t>(arr.size())};
}

这里有很多东西需要消化,但特别是这个函数的返回类型归结为 span<std::remove_reference<decltype(*arr.data())>, ...> .对于您给定的vector<float>给出 span<float,...>因为decltype(*arr.data())float & .我相信以下内容应该有效:

 const auto & cv = v;
 foobar(as_span(cv));

但不幸的是不能自己测试。让我知道这是否有效。

关于c++ - 强制 gsl::as_span 返回一个 gsl::span<const T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37727271/

相关文章:

c++ - 过滤参数包的类型

C++ 异常; int 还是 std::exception?

c++ - 模板编译: gcc vs VS2010

c++ - 什么是 C++ GSL 指南?

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

c++ - 关于平行网格生成的问题

c++ - 如何在 C++ 中实现指向指针数组的多个指针

c++ - 我应该如何表示我拥有的连续元素序列?

c++ - 将 <N> 传递给回调函数的模板化迭代器

c++ - 多尺度/分辨率 C++ 容器