给定以下函数,取:只读浮点跨度(具有动态或任何静态大小):
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()返回只读范围?
发布于 2016-06-09 14:33:13
在链接到的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));但不幸的是我无法亲自测试。如果这有用的话请告诉我。
发布于 2020-03-01 14:45:33
as_span不再是MS/GSL的一部分了,可能是因为gsl::span最近与std::span保持一致--您现在可以在C++20中使用它了。
您可以使用std::as_const获取一个const容器,并从它创建一个gsl::span (或者在您的情况下,在它上使用gsl::as_span )。
foobar(gsl::span<const float>(std::as_const(v)));请注意,根据foobar的实现,没有必要对其进行模板。你也可以直接写
void foobar(gsl::span<const float> x);默认情况下,span的长度为dynamic_extent,因此可以接受任意长度的跨度。当然,在编译期间,您将没有可用的长度。
https://stackoverflow.com/questions/37727271
复制相似问题