繁体   English   中英

使用gsl :: span和range-v3

[英]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()迭代器(相同类型)。

  • 如果它们一起工作是可组合的还是有任何理由使它们不兼容,那不是很酷吗?
  • 我认为这是一个问题,它源自range-v3中强大的“概念”用法。 如果语言支持某种其他概念功能,它是否会自动解决?
  • 如果我想在某些(非工业)软件中同时使用这两个库,我认为span目前需要一些适应性。 我应该改变什么来使这些工作在一起? (如果这是一个好主意)
  • 这也让我最终得到了一个问题:“什么有一个类可以满足于使用range-v3 ?” 从外墙,适配器或类似的继承是告诉编译器当前有关这些概念要求的唯一方法吗?

范围-v3中的View概念(以及范围TS,就此而言)要求类型R满足Range概念 - begin(r)end(r)划分迭代器范围 - 以及Semiregular概念 - R必须是复制/移动可构造复制/移动可分配,并且默认可构造。 Range的迭代器和sentinel类型( beginend返回)也必须是Semiregular (以及其他要求)。

span系列不满足View概念,因为span在某些情况下不是默认构造的,并且它们的迭代器在任何情况下都不是默认构造的。 因为即使标准C ++需要前向迭代器的默认构造,当前的span迭代器既不符合Ranges TS,范围-v3,也不符合标准C ++。

也就是说,满足所有这些系列要求所需的变化是最小的和直接的

20161207更新:

range-v3现在包含一个span的实现,它可以正确地为View / Range概念建模。

20170128更新:

gsl::span现在有默认的可构造迭代器。 因此,跨度现在可用于范围-v3。 具有动态范围的跨度(例如, gsl::span<int> )为RangeView概念建模,仅使用静态范围(例如, gsl::span<int, 42> )模型Range因为它们不符合View的默认施工要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM