[英]Using gsl::span with range-v3
我尝试了一个小例子来熟悉GSL和range-v3库,我想知道它们如何协同工作。 我有这个玩具的例子
#include <iostream>
#include <range/v3/all.hpp>
using namespace std;
using namespace ranges;
void example_vector(vector<int> const& v)
{
ranges::for_each(view::tail(v), [](int x){
cout << x << ' ';
});
cout << '\n';
}
int main()
{
auto seq = vector<int> { 2,2,2,0,0,2,1,2 };
example_vector(seq);
}
哪个有效。 但是如果我尝试使用gsl::span<int>
作为范围,则会导致错误消息。 编译器告诉我span
不会满足视图概念。
#include <gsl.h>
// ...
void example_span(gsl::span<const int> v)
{
ranges::for_each(view::tail(v), [](int x){
cout << x << ' ';
});
cout << '\n';
}
编译器消息:
note: candidate template ignored: disabled by 'enable_if'
[with Rng = gsl::span<const int, -1> &, Rest = <>, _concept_requires_123 = 42]
CONCEPT_REQUIRES_(ViewConcept<Rng, Rest...>())>
但在我的理解中,它应该是因为span
是一个特定的视图,甚至还有begin()
和end()
迭代器(相同类型)。
span
目前需要一些适应性。 我应该改变什么来使这些工作在一起? (如果这是一个好主意) range-v3
?” 从外墙,适配器或类似的继承是告诉编译器当前有关这些概念要求的唯一方法吗? 范围-v3中的View
概念(以及范围TS,就此而言)要求类型R
满足Range
概念 - begin(r)
和end(r)
划分迭代器范围 - 以及Semiregular
概念 - R
必须是复制/移动可构造复制/移动可分配,并且默认可构造。 Range
的迭代器和sentinel类型( begin
和end
返回)也必须是Semiregular
(以及其他要求)。
span
系列不满足View
概念,因为span
在某些情况下不是默认构造的,并且它们的迭代器在任何情况下都不是默认构造的。 因为即使标准C ++需要前向迭代器的默认构造,当前的span
迭代器既不符合Ranges TS,范围-v3,也不符合标准C ++。
也就是说,满足所有这些系列要求所需的变化是最小的和直接的 。
range-v3现在包含一个span
的实现,它可以正确地为View
/ Range
概念建模。
gsl::span
现在有默认的可构造迭代器。 因此,跨度现在可用于范围-v3。 具有动态范围的跨度(例如, gsl::span<int>
)为Range
& View
概念建模,仅使用静态范围(例如, gsl::span<int, 42>
)模型Range
因为它们不符合View
的默认施工要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.