【发布时间】: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<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() 迭代器(相同类型)。
- 如果它们一起工作是可组合的,那不是很酷吗? 两者不兼容有什么原因?
- 我认为这是一个来自强“概念”用法的问题 在范围-v3 中。如果有其他类型的,它会自动解决吗 语言是否支持概念功能?
- 我认为
span目前需要一些调整,如果我愿意的话 在某些(非工业)软件中同时使用这两个库。什么 我应该改变以使这些一起工作吗? (如果这是个好主意) - 这也最终使我想到了“有什么课程可以
fullfill 与
range-v3一起工作?”是从外墙继承, 适配器之类的唯一方式告诉编译器这些概念要求?
【问题讨论】:
-
查看 gsl github 问题页面。迭代器现在有很多问题,它们将被完全重写。 IMO 目前尚未处于生产就绪状态。
-
你能指出一个与我的问题直接相关的问题吗?我经历了大约 40 个问题,但也许我什么都不懂;^)。我什至无法让迭代器使用 range-v3 的任何函数。
-
对不起,我的意思是一般来说有很多问题,并不是说那里有解决方案。
标签: c++ range-v3 guideline-support-library