c++ - 如何使类与采用范围的 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
构造函数?是否需要实现更复杂的迭代器?
解决方案
这是因为您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()
解决方法是在您的Container
which return中添加一个非Type*
:
Type* data() { return m_Data; }
推荐阅读
- html - 引导卡的转换问题
- tensorflow - 没有 tf.contrib.rnn.MultiRNNCell 的多层 LSTM
- webpack - 在 Webpack 中加载 CSS 文件的问题
- java - 处理来自客户端的多个请求以更新 Spring 应用程序中的表中的列
- flutter - 有没有什么方法可以只从一个 DateTimePicker 中获得年、月、日和一个小时?
- laravel - laravel中的日期类型和格式招摇
- aws-lambda - 使用 Terraform 部署 Lambda 之前的数据库迁移
- react-native - 如何更改反应导航底部标签栏中的高度?
- r - 与坡面面积的相关图
- ios - 保存到文档目录时如何从空格中删除 % 符号