Я попробовал небольшой пример, чтобы привыкнуть к библиотекам 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
?» Является ли наследование от фасадов, адаптеров и т. д. единственным способом сообщить компилятору об этих концептуальных требованиях?