Использование gsl :: span с range-v3

Я попробовал небольшой пример, чтобы привыкнуть к библиотекам 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 В настоящее время требуется некоторая адаптация, если бы я хотел
    использовать обе библиотеки вместе в некотором (непромышленном) программном обеспечении. Какие
    я должен изменить, чтобы заставить их работать вместе? (если это вообще хорошая идея)
  • Это также приводит меня в конечном итоге к вопросу о том, »
    полная работа с range-v3«Является ли наследство от фасадов,
    адаптеры или такой единственный способ сообщить компилятору в настоящее время об этих концептуальных требованиях?

7

Решение

View концепция в диапазоне-v3 (и диапазоны TS, в этом отношении) требует типа R чтобы удовлетворить как Range концепция — begin(r) а также end(r) ограничить диапазон итератора — и Semiregular концепция — R должно быть назначено копируемое / перемещаемое копируемое копируемое / перемещаемое и конструируемое по умолчанию. Итератор и сторожевые типы Range (какие begin а также end возвращение) также должно быть Semiregular (среди других требований).

span семья не удовлетворяет View концепция с spanВ некоторых случаях они не могут быть конструируемыми по умолчанию, а их итераторы не могут быть конструируемыми по умолчанию. Поскольку даже стандартный C ++ требует построения по умолчанию для прямых итераторов, текущий span итераторы не соответствуют ни диапазонам TS, ни range-v3, ни стандарту C ++.

Тем не менее, изменения, необходимые для удовлетворения всех этих семейств требований минимальны и прямолинейны.

20161207 Обновление:

range-v3 теперь содержит реализацию span который правильно моделирует View/Range концепции.

20170128 Обновление:

gsl::span теперь по умолчанию есть конструируемые итераторы. Следовательно, диапазоны теперь можно использовать с range-v3. Пролеты с динамическим экстентом (например, gsl::span<int>) смоделируйте Range & View концепции, охватывающие статический степень (например, gsl::span<int, 42>) только модель Range так как они не встречаются ViewТребование для строительства по умолчанию.

8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]