我尝试了一个小例子来习惯 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...>())>
但据我了解,它应该是因为 aspan
是一个特定的视图,甚至具有begin()
和end()
迭代器(相同类型)。
- 如果他们一起工作是可组合的,或者有什么理由不兼容,那不是很酷吗?
- 我认为这是一个来自 range-v3 中强大的“概念”使用的问题。如果该语言支持某种其他类型的概念功能,它会自动解决吗?
span
如果我想在某些(非工业)软件中同时使用这两个库,我认为目前需要一些调整。我应该改变什么才能使这些协同工作?(如果这是个好主意的话)- 这也最终使我想到了“有什么课程可以完成工作
range-v3
?”的问题。从外观、适配器或此类继承是当前告诉编译器这些概念要求的唯一方法吗?