如何使类与采用范围的 std::span 构造函数兼容?

Dea*_*con 2 c++ c++20 std-span std-ranges

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

template< class R >
explicit(extent != std::dynamic_extent)
constexpr span( R&& range );
Run Code Online (Sandbox Code Playgroud)

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

例如,std::vector我们可以这样做:

std::vector<int> v = {1, 2, 3};
auto span = std::span{v};
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

康桓瑋*_*康桓瑋 7

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

\n
template<class T>\n  concept contiguous_\xc2\xadrange =\n    random_\xc2\xadaccess_\xc2\xadrange<T> && contiguous_\xc2\xaditerator<iterator_t<T>> &&\n    requires(T& t) {\n      { ranges::data(t) } -> same_\xc2\xadas<add_pointer_t<range_reference_t<T>>>;\n    };\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
Type* data()  { return m_Data; }\n
Run Code Online (Sandbox Code Playgroud)\n