【问题标题】:Using gsl::span with range-v3将 gsl::span 与 range-v3 一起使用
【发布时间】:2016-03-26 10:30:05
【问题描述】:

我尝试了一个小例子来习惯 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&lt;int&gt; 作为范围,则会导致出现错误消息。编译器告诉我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() 迭代器(相同类型)。

  • 如果它们一起工作是可组合的,那不是很酷吗? 两者不兼容有什么原因?
  • 我认为这是一个来自强“概念”用法的问题 在范围-v3 中。如果有其他类型的,它会自动解决吗 语言是否支持概念功能?
  • 我认为span 目前需要一些调整,如果我愿意的话 在某些(非工业)软件中同时使用这两个库。什么 我应该改变以使这些一起工作吗? (如果这是个好主意)
  • 这也最终使我想到了“有什么课程可以 fullfill 与range-v3 一起工作?”是从外墙继承, 适配器之类的唯一方式告诉编译器这些概念要求?

【问题讨论】:

  • 查看 gsl github 问题页面。迭代器现在有很多问题,它们将被完全重写。 IMO 目前尚未处于生产就绪状态。
  • 你能指出一个与我的问题直接相关的问题吗?我经历了大约 40 个问题,但也许我什么都不懂;^)。我什至无法让迭代器使用 range-v3 的任何函数。
  • 对不起,我的意思是一般来说有很多问题,并不是说那里有解决方案。

标签: c++ range-v3 guideline-support-library


【解决方案1】:

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

span 系列不满足View 概念,因为spans 在某些情况下不是默认可构造的,并且它们的迭代器在任何情况下都不是默认可构造的。由于即使是标准 C++ 也需要对 Forward 迭代器进行默认构造,所以当前的 span 迭代器既不符合 Ranges TS、range-v3 也不符合标准 C++。

也就是说,为了满足所有这些要求系列are minimal and straight-forward 所必需的更改。

20161207 更新:

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

20170128 更新:

gsl::span 现在有默认的可构造迭代器。因此,跨度现在可与 range-v3 一起使用。具有动态范围的跨度(例如,gsl::span&lt;int&gt;)模拟RangeView 概念,具有静态 范围的跨度(例如,gsl::span&lt;int, 42&gt;)仅模型Range,因为它们不满足View的默认构造要求。

【讨论】:

  • 感谢您的洞察力和知识库!
猜你喜欢
  • 2021-05-26
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多