Я попробовал небольшой пример, чтобы привыкнуть к библиотекам 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()
итераторы (того же типа).
span
В настоящее время требуется некоторая адаптация, если бы я хотелrange-v3
«Является ли наследство от фасадов, View
концепция в диапазоне-v3 (и диапазоны TS, в этом отношении) требует типа R
чтобы удовлетворить как Range
концепция — begin(r)
а также end(r)
ограничить диапазон итератора — и Semiregular
концепция — R
должно быть назначено копируемое / перемещаемое копируемое копируемое / перемещаемое и конструируемое по умолчанию. Итератор и сторожевые типы Range
(какие begin
а также end
возвращение) также должно быть Semiregular
(среди других требований).
span
семья не удовлетворяет View
концепция с span
В некоторых случаях они не могут быть конструируемыми по умолчанию, а их итераторы не могут быть конструируемыми по умолчанию. Поскольку даже стандартный C ++ требует построения по умолчанию для прямых итераторов, текущий span
итераторы не соответствуют ни диапазонам TS, ни range-v3, ни стандарту C ++.
Тем не менее, изменения, необходимые для удовлетворения всех этих семейств требований минимальны и прямолинейны.
range-v3 теперь содержит реализацию span
который правильно моделирует View
/Range
концепции.
gsl::span
теперь по умолчанию есть конструируемые итераторы. Следовательно, диапазоны теперь можно использовать с range-v3. Пролеты с динамическим экстентом (например, gsl::span<int>
) смоделируйте Range
& View
концепции, охватывающие статический степень (например, gsl::span<int, 42>
) только модель Range
так как они не встречаются View
Требование для строительства по умолчанию.
Других решений пока нет …