首页 > 解决方案 > 如何使类与采用范围的 std::span 构造函数兼容?

问题描述

我希望能够将我的自定义容器传递给这个std::span构造函数:

template< class R >
explicit(extent != std::dynamic_extent)
constexpr span( R&& range );

我需要向我的自定义类添加什么以使其满足能够将其传递给std::span接收范围的构造函数的要求?

例如,std::vector我们能够做到这一点:

std::vector<int> v = {1, 2, 3};
auto span = std::span{v};

我已经将这些添加到我的自定义类中:

Type* begin()
{
    return m_Data;
}

Type* end()
{
    return m_Data + m_Length;
}

const Type* data() const
{
    return m_Data;
}

size_t size() const
{
    return m_Length;
}

...这反过来又允许我使用基于范围的循环,std::data(my_container)以及std::size(my_container). 我错过了什么,以便我也可以将我的容器传递给std::span构造函数?是否需要实现更复杂的迭代器?

标签: c++c++20std-rangesstd-span

解决方案


这是因为您Container不满足contiguous_range,其定义为:

template<class T>
  concept contiguous_­range =
    random_­access_­range<T> && contiguous_­iterator<iterator_t<T>> &&
    requires(T& t) {
      { ranges::data(t) } -> same_­as<add_pointer_t<range_reference_t<T>>>;
    };

requires子句中, is 的返回类型与ranges::data(t)isconst Type*不同。add_pointer_t<range_reference_t<T>>Type*

const data()解决方法是在您的Containerwhich return中添加一个非Type*

Type* data()  { return m_Data; }

推荐阅读